Преобразование char* в float или double

у меня есть значение, которое я читаю из файла и хранится как char*. Значение-денежное число,#.##, ##.##, или.### ##. Я хочу преобразовать char* в число, которое я могу использовать в расчетах, я пробовал atof и strtod, и они просто дают мне номера мусора. Что такое правильный способ сделать это, и почему я делаю это неправильно?

это по существу то, что я делаю, просто значение char* считывается из файла. Когда я распечатываю переменные temp и ftemp, они просто мусор, гигантские отрицательные числа.

Другой Редактировать:

я запускаю именно это в gcc

#include <stdio.h>
int main()
{
 char *test = "12.11";
 double temp = strtod(test,NULL);
 float ftemp = atof(test);
 printf("price: %f, %f",temp,ftemp);
 return 0;

}

и мой выход цена: 3344336.000000, 3344336.000000

Edit: вот мой код

if(file != NULL)
    {
        char curLine [128];
        while(fgets(curLine, sizeof curLine, file) != NULL)
        {               
            tempVal = strtok(curLine,"|");          
            pairs[i].name= strdup(tempVal);
            tempVal = strtok(NULL,"|");
            pairs[i].value= strdup(tempVal);
            ++i;
        }
        fclose(file);
    }

    double temp = strtod(pairs[0].value,NULL);
    float ftemp = atof(pairs[0].value);
    printf("price: %d, %f",temp,ftemp);

мой входной файл очень простое имя, пары значений, как это:

NAME|VALUE
NAME|VALUE
NAME|VALUE

со значением, являющимся суммами в долларах

решено: спасибо всем, я использовал %d вместо %f и не имел правильные заголовки включены.

3 ответов


вам не хватает include : #include <stdlib.h>, поэтому GCC создает неявное объявление atof и atod, что приводит к значениям мусора.

и спецификатор формата для double -%f, а не %d (то есть для целых чисел).

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

int main()
{
  char *test = "12.11";
  double temp = strtod(test,NULL);
  float ftemp = atof(test);
  printf("price: %f, %f",temp,ftemp);
  return 0;
}
/* Output */
price: 12.110000, 12.110000

код, размещенный вами, является правильным и должен был работать. Но проверьте точно, что у вас есть в char*. Если правильное значение должно быть большим для представления, функции вернут положительное или отрицательное HUGE_VAL. Проверьте, что у вас есть в char* от максимальных значений, что float и double может представлять на ваш компьютер.

Регистрация этой странице strtod ссылка и этой странице atof ссылка.

Я пробовал пример, который вы предоставили в Windows и Linux, и он работал нормально.


printf("price: %d, %f",temp,ftemp); 
              ^^^

это ваши проблемы. Поскольку аргументы имеют тип double и float, вы должны использовать %f для обоих (так как printf - это функция с переменным числом аргументов, ftemp будет повышен до double).

%d ожидает, что соответствующий аргумент будет type int, а не double.

variadic функции, как printf на самом деле не знаю типов аргументов в списке аргументов переменных; вы должны сказать это с помощью спецификатора преобразования. С тех пор, как ты сказал printf что первый аргумент должен быть int, printf возьмет следующий sizeof (int) байты из списка аргументов и интерпретировать его как целое значение; следовательно, первый номер мусора.

теперь, это почти гарантировано, что sizeof (int) sizeof (double), когда printf новый sizeof (double) байты из списка аргументов, вероятно, начинаются со среднего байта temp, а не первый байт ftemp; следовательно, второй номер мусора.

использовать %f для обоих.