我有一个从文件读入的值并存储为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
编辑:这是我的代码
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,并且没有包含正确的标题。
答案 0 :(得分:27)
你错过了一个包含:
#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
答案 1 :(得分:1)
您发布的代码是正确的,应该有效。但请确切查看char*
中的内容。如果要表示的值正确,则函数将返回正数或负数HUGE_VAL
。根据{{1}}和char*
可在您的计算机上显示的最大值,检查float
中的内容。
检查this page for strtod
reference和this page for atof
reference。
我已经尝试过您在Windows和Linux中提供的示例,但它运行良好。
答案 2 :(得分:0)
printf("price: %d, %f",temp,ftemp);
^^^
这是你的问题。由于参数类型为double
和float
,因此您应该对%f
使用printf
(因为ftemp
是一个可变函数,double
将被提升为{ {1}})。
%d
期望相应的参数为int
,而不是double
。
像printf
这样的变量函数并不真正知道变量参数列表中参数的类型;你必须用转换说明符告诉它。由于您告诉printf
第一个参数应该是int
,因此printf将从参数列表中获取下一个sizeof (int)
个字节并将其解释为整数值;因此第一个垃圾号码。
现在,几乎可以保证sizeof (int)
&lt; sizeof (double)
,所以当printf
从参数列表中获取下一个sizeof (double)
字节时,它可能从temp
的中间字节开始,而不是{{1}的第一个字节}};因此第二个垃圾号码。
两者都使用ftemp
。