C:将argv [1]转换为double

时间:2013-12-14 00:18:40

标签: c

我需要将double传递给我的程序,但以下内容不起作用:

int main(int argc, char *argv[]) {

double ddd;

ddd=atof(argv[1]);

printf("%f\n", ddd);

return 0;
}

如果我将程序作为./myprog 3.14运行,它仍会打印0.000000

有人可以帮忙吗?

3 个答案:

答案 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}}。可能的情况是,您所在的特定系统上的调用约定指定doubleint在不同的寄存器中返回,因此double很可能只是无论发生在那个特定的寄存器中,0返回值都在萎缩,未被观察到。

答案 2 :(得分:2)

在C中,您不需要在使用之前声明函数(与C ++相反),如果发生这种情况(没有原型),编译器会对该函数做出一些假设。其中一个假设是它返回int。没有错误,atof()有效,但它工作不正常。它通常会得到应该返回int的寄存器中的任何值(在您的情况下为0,但它可能是其他的)。

P.S。 atof()atoi()隐藏输入错误(您可以通过向gcc编译器调用添加选项-Wall来查看:gcc -Wall test.c),因此大多数人更喜欢使用strtol()和而是strtod()