将argv[1]转换为双精度浮点数(C语言相关)

10

我需要将一个double类型的值传递给我的程序,但以下代码不起作用:

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

double ddd;

ddd=atof(argv[1]);

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

return 0;
}
如果我以./myprog 3.14的形式运行我的程序,它仍然会打印出0.000000。请问有人可以帮忙吗?

你在尝试编译时,编译器是否报错或警告了? - Oliver Charlesworth
你的意思是它返回0还是打印0?因为你在最后一行告诉它返回0。 - Pyrce
我已经澄清了我的问题。感谢您指出这一点。 - Martin Vegter
3个回答

8

我猜你可能忘记包含#include <stdlib.h>。如果是这样,gcc将会发出以下警告:

warning: implicit declaration of function 'atof' [-Wimplicit-function-declaration]

请提供您提供的精确输出:0.000000


你是在试图阐述低声望的影响吗? :-)) - Kerrek SB
添加 #include <stdlib.h> 解决了问题。但奇怪的是,没有包含 stdlib.h 时,gcc 没有发出任何警告。 - Martin Vegter
@MartinVegter:你确定说的是 gcc -W -Wall -Wextra -pedantic 吗? - Kerrek SB
这里的重点是:人们应该包括代码中重要的部分,如#include和编译输出。 - myradio

4
正如remyabel所指出的那样,您可能忘记了包含`#include `。原因在于,在没有声明 `atof()` 的情况下,C标准规定返回值假定为 `int`。 在这种情况下,它不是 `int`,这意味着您观察到的实际行为(返回值为 `0`)在技术上未指定。
需要明确的是,如果没有 `double` 返回声明,则行 `ddd = atof(argv [1])` 被视为对返回 `int` 的函数的调用,其结果然后被转换为 `double`。 在您所在的特定系统上,调用惯例可能规定要将 `int` 和 `double` 返回到不同的寄存器中,因此 `0` 可能只是该特定寄存器中存在的任何值,而 `double` 返回值则被搁置未观察。

2
在C语言中,你不需要在使用函数之前声明它(与C++相比),如果发生这种情况(没有原型),编译器会对该函数进行一些假设。其中一个假设是它返回int类型。虽然没有错误,atof()函数可以工作,但它的工作方式是不正确的。它通常获取int类型应该返回的寄存器中存在的任何值(在您的情况下为0,但也可能是其他值)。
附注:atof()和atoi()函数隐藏了输入错误(您可以通过将选项-Wall添加到gcc编译器调用中来查看这些错误:gcc -Wall test.c),因此大多数人更喜欢使用strtol()和strtod()函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接