Преобразование 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 для обоих.