c - HPUX atof 不会将字符串转换为 double

标签 c hp-ux

我正在获取 hpux 机器的版本号并尝试使用 atof 将其转换为 float ,但发生了这种情况:

#include <stdio.h>
#include <sys/utsname.h>

int main(int argc, char *argv[]) {
        struct utsname u;
        uname(&u);
        char* release = u.release;
        while (*release != '.')
                release++;
        release++;
        printf("%s\n", release);
        printf("%f\n", atof(release));
}

打印这个:

# ./test
11.31
0.000000

返回double 0 表示转换失败。 utsname 手册页说字符串以空值终止,所以我不明白为什么 atof 命令失败。我在这里犯了一些明显的错误吗?

最佳答案

atof函数在 <stdlib.h> 中声明.

如果你在没有必要的 #include <stdlib.h> 的情况下调用它,最有可能的结果是 (a) 您的编译器将打印一条警告(您显然已忽略),并且 (b) 编译器将假定 atof返回 int结果。

添加

#include <stdlib.h>

到源文件的顶部。并注意编译器警告。如果您没有收到警告,请找出如何以一种方式调用您的编译器,使其对此类事情发出警告。 (我不知道您使用的是什么编译器,所以我无法提供具体信息。) 对于 gcc,您使用的编译器是 -Wall选项将启用此警告。

一些背景:

在 ISO C 标准的 1999 版之前,允许调用没有可见声明的函数。编译器将假设该函数接受调用中传递的(提升的)类型的参数,并且它返回类型为 int 的结果。 .如果函数确实返回 int,这通常会正常工作。 ,并且如果您正确编写了调用(并且该函数不是可变的,例如 printf )。

标准的 1999 版本(“C99”)放弃了“隐式 int”规则,使对没有可见声明的函数的任何调用都成为约束违规,需要诊断(可以是非致命警告)。许多编译器只会警告错误,然后根据旧规则处理调用。而且 gcc 默认情况下仍然不执行 C99 规则;它的默认方言是“GNU90”,由 1990 ISO C 标准加上特定于 GNU 的扩展组成。您可以要求它使用带有“-std=c99”的 C99 语义;要强制这些语义,您可以使用“-std=c99 -pedantic”或“-std=c99 -pedantic-errors”。

如果您指定“-std=c11”,较新版本的 gcc(部分)支持最新的 2011 标准。

参见 the gcc 4.8.2 manual了解详情。

关于c - HPUX atof 不会将字符串转换为 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23203426/

相关文章:

c - 在数组中的给定位置插入一个元素,最后几个元素没有显示在数组中

c++ - 基于时间的(真正的)随机数?

c - 标识符 "snprintf"未定义

linux - 找到 : -exec not terminated with ';'\\when trying to delete some old files

c# - 在 HPUX 上运行 C#

c - 练习6-4 C 语言编程

c - 如何在 Ragel 中实现前瞻

c++ - 如何避免在 linux 上使用系统标准 C/C++ 库?

c - 过程识别