【问题标题】:Why does the atof() function not return 0 when I pass it a string with invalid characters after a number?为什么当我向 atof() 函数传递一个数字后包含无效字符的字符串时,它不返回 0?
【发布时间】:2016-05-19 17:44:10
【问题描述】:

我需要将字符串转换为浮点数。如果字符串不是数字,我希望返回 0。

我已尝试使用以下代码测试atof() 函数是否适用于此:

printf("%f", atof("1a"));

根据我对atof的理解,atof不能转换时返回的值为0,而这一行却打印了1.0

为什么会这样?根据文档,我了解到 atof 意味着只要输入不是数字就返回 0。

【问题讨论】:

  • 您最好使用:strtod()。请注意atof() 实际上返回的是double,而不是float。注意:函数:atof() 会将1 视为有效数字并返回转换结果:1.000000。它没有理由返回 0.000000,因为有一个有效的数字可以转换。

标签: c ansi-c atof


【解决方案1】:

来自doc。强调我的

函数首先丢弃尽可能多的空白字符(如 isspace) 根据需要,直到第一个非空白字符 成立。然后,从这个字符开始,取尽可能多的字符 尽可能遵循类似于的语法是有效的 浮点文字(见下文),并将它们解释为 数值。最后一个有效字符之后的其余字符串 被忽略并且对该函数的行为没有影响。

【讨论】:

    【解决方案2】:

    我看到您检查了一些文档,但您一定错过了强调的部分 - 确保您彻底阅读文档很重要:http://www.cplusplus.com/reference/cstdlib/atof/

    该函数首先根据需要丢弃尽可能多的空白字符(如在 isspace 中),直到找到第一个非空白字符。然后,从这个字符开始,尽可能多地采用类似于浮点文字的语法(见下文)的有效字符,并将它们解释为数值。 最后一个有效字符之后的字符串被忽略,对这个函数的行为没有影响。

    因此,函数的行为完全符合其应有的行为 - "1a" 中的 a 字符被忽略。

    【讨论】:

      【解决方案3】:

      然而这一行打印的是 1.0。

      printf("%f", atof("1a"));
      

      之所以有效,是因为atof 在这种情况下可以解析至少一个数字,即1

      但是:

      char a[]="a1";
      printf("%f\n",atof(a));
      

      应该如你所愿地给你一个 0.0 的返回值。

      【讨论】:

        猜你喜欢
        • 2012-02-04
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-06
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多