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