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