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

时间:2014-04-21 18:28:13

标签: c hp-ux

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

#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命令失败。我在这里犯了一些明显的错误吗?

1 个答案:

答案 0 :(得分:3)

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

如果你在没有所需#include <stdlib.h>的情况下调用它,最可能的结果是(a)你的编译器会打印一个警告(你显然已经忽略了),并且(b)编译器会假设{ {1}}会返回atof个结果。

添加

int

到源文件的顶部。并注意编译器警告。如果你没有得到警告,请找出如何调用编译器以使其警告这种事情。 (我不知道你正在使用什么编译器,所以我不能提供细节。)对于你正在使用的编译器gcc,#include <stdlib.h> 选项将启用此警告

一些背景知识:

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

1999版标准(“C99”)删除了“隐式printf”规则,对没有可见声明的函数进行任何调用约束违规,需要诊断(这可能是一个非致命的警告)。许多编译器只会警告错误,然后根据旧规则处理调用。并且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