C语言 将字符* 转换为浮点数或双精度



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

您缺少包含: #include <stdlib.h>,所以GCC创建了一个隐式的atofatod声明,导致垃圾值。

双精度的格式说明符是 %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
<</div> div class="one_answers">

您发布的代码是正确的,应该可以工作。但是请准确检查您在char*中拥有的内容。如果正确的值要表示为大,则函数将返回正或负HUGE_VAL。根据floatdouble可以在计算机上表示的最大值检查char*中的内容。

查看

此页面以获取strtod参考,并查看此页面以获取atof参考。

我已经尝试了您在Windows和Linux中提供的示例,并且工作正常。

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

这是你的问题。 由于参数是类型 doublefloat ,您应该对两者使用 %f(因为printf是一个可变参数函数,ftemp将被提升为 double )。

%d期望相应的参数是类型 int ,而不是 double

printf这样的可变参数函数并不真正知道变量参数列表中的参数类型;你必须用转换说明符告诉它。 由于您告诉printf第一个参数应该是int,printf 将从参数列表中获取接下来的 sizeof (int) 个字节并将其解释为整数值;因此是第一个垃圾号码。

现在,几乎可以保证sizeof (int) <sizeof (double),所以当printf从参数列表中获取接下来的sizeof (double)字节时,它可能从temp的中间字节开始,而不是ftemp的第一个字节;因此是第二个垃圾数。>

对两者使用 %f

最新更新