【问题标题】:Converting char* to float or double将 char* 转换为 float 或 double
【发布时间】:2012-05-15 17:11:17
【问题描述】:

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

【问题讨论】:

  • 问题一定出在其他地方,您发布的代码完全有效并且可以正常工作。请向我们展示您是如何阅读文件的。
  • 2. %d 用于整数。使用%f
  • 3.你忘了#include &lt;stdlib.h&gt;

标签: c strtod atof


【解决方案1】:

您缺少一个 include : #include &lt;stdlib.h&gt;,因此 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

【讨论】:

  • +1。正确的。这就是问题。 [在 OPs 编辑之前,实际上存在三个问题]
【解决方案2】:

您发布的代码是正确的,应该可以正常工作。但请准确检查char* 中的内容。如果正确的值太大而无法表示,函数将返回正数或负数HUGE_VAL。对照floatdouble 可以在您的计算机上表示的最大值检查您在char* 中的内容。

检查this page for strtod referencethis page for atof reference

我已经在 Windows 和 Linux 中尝试了您提供的示例,并且效果很好。

【讨论】:

  • 根据:pubs.opengroup.org/onlinepubs/007904875/functions/atof.html(符合C标准):“如果值无法表示,则行为未定义。”
  • 这些值都远小于任一变量类型可以表示的最大值,我拥有的最大值是 120.55。
  • @George:不要使用 cplusplus.com。它充满了错误。如果发生溢出,atofstrtod 都不会返回 HUGE_VAL。根据cppreference,返回值未定义。
【解决方案3】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-21
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    相关资源
    最近更新 更多