我需要将double传递给我的程序,但以下内容不起作用:
int main(int argc, char *argv[]) {
double ddd;
ddd=atof(argv[1]);
printf("%f\n", ddd);
return 0;
}
如果我将程序作为./myprog 3.14
运行,它仍会打印0.000000
。
有人可以帮忙吗?
答案 0 :(得分:8)
我的猜测是你忘了加入#include <stdlib.h>
。如果是这种情况,gcc
将发出以下警告:
warning: implicit declaration of function 'atof' [-Wimplicit-function-declaration]
并提供您提供的确切输出:0.000000
。
答案 1 :(得分:4)
正如雷米亚贝尔所说,你可能忽略了#include <stdlib.h>
。重要的是,如果没有声明atof()
,C标准规定返回值假定为int
。在这种情况下,它不是int
,这意味着您观察到的实际行为(获得0
的返回值)在技术上是未指定的。
要明确的是,如果没有double
- 返回声明,则行ddd=atof(argv[1])
将被视为对int
- 返回函数的调用,其结果将被转换为{{ 1}}。可能的情况是,您所在的特定系统上的调用约定指定double
和int
在不同的寄存器中返回,因此double
很可能只是无论发生在那个特定的寄存器中,0
返回值都在萎缩,未被观察到。
答案 2 :(得分:2)
在C中,您不需要在使用之前声明函数(与C ++相反),如果发生这种情况(没有原型),编译器会对该函数做出一些假设。其中一个假设是它返回int
。没有错误,atof()
有效,但它工作不正常。它通常会得到应该返回int
的寄存器中的任何值(在您的情况下为0,但它可能是其他的)。
P.S。 atof()
和atoi()
隐藏输入错误(您可以通过向gcc编译器调用添加选项-Wall来查看:gcc -Wall test.c
),因此大多数人更喜欢使用strtol()
和而是strtod()
。