我正在获取 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/