【问题标题】:Why does strtof always output 0.0000?为什么strtof总是输出0.0000?
【发布时间】:2012-01-13 06:00:26
【问题描述】:

用浮点数调用strtof 在我的本地机器上运行良好,但在学校的服务器上strtof 总是返回0.000000。我检查了errno 中是否存储了任何内容,因为 0 应该表示错误,但它表示成功。有谁知道为什么会这样?

这里是代码。

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("%f\n", strtof(argv[1],0));
    return 0;
}

【问题讨论】:

  • 您应该给我们一个简单的、工作的代码示例,该示例是您在两台机器上编译和运行的代码及其输出,以便我们提供帮助。
  • @Lucas:里面没有strtof()。错字?
  • 对不起,它现在在那里。刚刚在两台机器上测试,在学校服务器上一直显示为 0.000000。
  • 你用-Wall编译了吗?在我的盒子里,strtof() 没有定义,除非你已经定义了 _XOPEN_SOURCE=600_ISOC99_SOURCE-Wall 会警告你。

标签: c string floating-point


【解决方案1】:

短版:使用-std=gnu99-std=c99 编译。解释如下。

我在自己的盒子上重现了类似的“问题”。但是,当我尝试编译时:

# gcc -Wall -o float float.c
float.c: In function 'main':
float.c:6: warning: implicit declaration of function 'strtof'
float.c:6: warning: format '%f' expects type 'double', but argument 2 has type 'int'

所以我查看了manstrtof() 页面,上面写着:

SYNOPSIS
   #include <stdlib.h>

   double strtod(const char *nptr, char **endptr);

   #define _XOPEN_SOURCE=600   /* or #define _ISOC99_SOURCE */
   #include <stdlib.h>

   float strtof(const char *nptr, char **endptr);
   long double strtold(const char *nptr, char **endptr);

这意味着其中一个值必须是#defined,然后才能包含stdlib.h。但是,我刚刚使用 -std=gnu99 重新编译,它为我定义了其中一个并且它可以工作。

# gcc -std=gnu99 -Wall -o float float.c
# ./float 2.3
2.300000

道德:始终使用-Wall 进行编译。 ;-)

【讨论】:

  • 有趣。这是否意味着我学校机器上的“默认”编译器都不是这些?是否调用了另一个 strtof?
  • @Lucas:我相信默认值gcc 的编译会因系统而异。也许是操作系统,我不确定;其他人可能能够揭示更多的光。但是编译器(如果你在命令行上使用gcc)仍然是gcc,它只是使用不同的标准来决定如何编译你的程序。您可以在这里查看一些基本信息:gcc.gnu.org/onlinedocs/gcc/Standards.html
  • -Wall -Werror,否则您会错过警告(尤其是在文件很多的情况下)。
  • @Lucas:无论哪种方式,它都会调用相同的strtof 函数,但如果没有-std=c99,它会错误地调用它,因为它看不到声明。
【解决方案2】:

你是否包含了定义 strtof 的头文件(stdlib.h),否则你可能会得到 0.0,因为默认情况下 C 中的未知函数被视为返回 int。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 2017-06-12
    • 2014-10-24
    • 1970-01-01
    • 2020-06-26
    • 2018-09-19
    • 1970-01-01
    相关资源
    最近更新 更多