2012-06-15 2 views
1

Я написал программу, которая получает строку, а затем вычислить суммарное значение строки togheder ... Для примера:Получение странных ошибок указателя, хотя и не с помощью указателей

char data[256] = "1$0.83331333333333334$false$false"; // the data 

Здесь я нужно сделать расчет 1 + 0.83331333333333334 так это то, что я писал:

char data[256] = "1$0.83331333333333334$false$false"; // the data 
double grade = 0; 
int i = 0; 
int times = 0; 
char temp[256] = ""; 

int flag = 0; 

while (flag == 0) 
{ 
     times = 0; 

     if (isdigit(data[i])) // if it's a number 
     { 
          if (data[i + 1] == '.') // if it's a double number 
          { 
             i = i + 2; 
           while (isdigit(data[i])) // putting it into a temp array 
           { 
            temp[i] = data[i]; 
            i++; 
            times++; 
           } 
           grade = grade + (double)temp/(times * 10); 
          } 
          grade = grade + (int)data[i]; // if it's an int number, putting it into grade right away 
     } 

     if (data[i] == '\0') 
     { 
        flag = 1; 
     } 

     i++; 
} 

printf ("%f\n", grade); 

проблема в линии:

grade = grade + (double)temp/(times * 10); 

оно говорит «значение указателя, используемое там, где ожидалось значение с плавающей запятой». я действительно couldent понимаю, Что проблема ...

Спасибо :)

Edit:

Спасибо за вашу помощь! Я смог преобразовать число в строку .. так, например, теперь, если у меня есть большая строка в данных, с парой двойников внутри нее, я могу принимать петлю каждый раз, когда двойной в новый строка. Я использовал atof, чтобы преобразовать его в двойной, хотя кажется, что двойной слишком мал .. Например: У меня в строке temp: «83331333333333334», и я использовал atof на нем -> новый double имеет 8333313 только ... остальное похоже на невключение в двойное. Я предполагаю, что число слишком велико для двойного номера ... так что я могу сделать? Спасибо!

+0

temp - это символ *, и вы меняете в два раза – BlackBear

+0

Я знаю, вот что я пытался сделать ..? – AmitM9S6

+0

Возможно, вам захотелось _conversion_, так как @ouah предложил – BlackBear

ответ

2

Вы не можете просто выделить массив char в double и ожидать, что компилятор обработает его как double. Вам необходимо преобразовать temp с помощью подходящей функции, такой как strtod, а затем использовать это значение в ваших расчетах.

Заметим, что strod требует строку типа С, то есть массив символов с нулевым символом. Итак, пройти в temp не достаточно. Нужно указать нулевое значение temp.Если вы закончите вставлять цифры, добавьте temp[ i ] = 0;.

Вот небольшая программа, которая, вероятно, поможет вам исправить свои ошибки и поможет вам использовать strtod:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main() { 
char data[256] = "1$0.83331333333333334$false$false"; // the data 
char *p = strtok(&data[ 0 ], "$"); 
while (p) { 
    double d = strtod(p, NULL); 
    printf("extracted value = %.10f\n", d); 
    p = strtok(NULL, "$"); 
} 
} 

Поскольку ОП хотел что-то более простое, чем strtod:

Вы можете использовать double atof(const char *nptr);. В моем источнике образца замените strtod(p, NULL); на atof(p);, и это должно вас начать. Проблема с atof и друзьями в том, что обработка ошибок сложна, и если значение не может быть представлено, вы молча вызываете неопределенное поведение.

+0

strtod дал мне результат 0.000, который не может быть ... – AmitM9S6

+0

@ AmitM9S6: См. Редактирование моего ответа. – dirkgently

+0

Я добавил temp [i + 1] = 0 (потому что последний temp [i] имеет число), хотя он stll дает мне нуль .... – AmitM9S6

2

temp - массив, а при оценке в выражении он преобразуется в указатель на его первый элемент. Используйте strtod, чтобы преобразовать строку в double.

+0

Я пытаюсь показать, что я написал, хотя я понятия не имею, как писать код в комментарии ... «Кодекс», похоже, работает со мной ... в любом случае, используя strtod, он дал мне двойной номер 0.000, а когда я напечатал числа, входящие в temp [i], он дал точный двойной номер ... – AmitM9S6

Смежные вопросы