将char *转换为float或double

时间:2012-05-15 17:11:17

标签: c strtod atof

我有一个从文件读入的值并存储为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,并且没有包含正确的标题。

3 个答案:

答案 0 :(得分:27)

你错过了一个包含: #include <stdlib.h>,因此GCC会创建atofatod的隐式声明,从而导致垃圾值。

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 referencethis page for atof reference

我已经尝试过您在Windows和Linux中提供的示例,但它运行良好。

答案 2 :(得分:0)

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

这是你的问题。由于参数类型为doublefloat,因此您应该对%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