我正在学习C,我有以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{
double x;
printf("x = ");
scanf("%ld", &x);
printf("x = %lf\n", x);
system("PAUSE");
return 0;
}
(我正在使用Dev C4.9,Windows XP SP3)
当我运行上述程序并进入5.3时;程序打印x = 0.000000
有人可以解释为什么会这样吗?
非常感谢。
答案 0 :(得分:4)
%ld
格式字符串表示它希望在long signed int
中读取,但您传递的却是double
。您应该使用%lf
格式说明符来表示您需要double
。
请注意,对于scanf
,l
需要double
(float
s需要{}},而printf
则需要l
,%lf
中的%f
无效:%lf
和float
的{{1}}和double
都有相同的输出默认参数提升。
答案 1 :(得分:0)
代表scanf
ld:
same as "%d" except argument is "long" integer. Since "long"
is the same as "int" on GCOS8,this is the same as "%d". However, the compiler
will warn you if you specify "%ld" but pass a normal "int", or specify "%d" but
pass a "long".
代表printf
lf:
same as "%f" except argument is "long double".
Since "long double" is the same as "double" on GCOS8, this is the same as "%f".
答案 2 :(得分:0)
与scanf和printf的数据保持一致。 加上%lf(double),%f(浮动),%lld(long long int)我在windows中遇到了问题。它在Windows中没有很好地实现(如果你问的话,是msvcrt.dll)。
答案 3 :(得分:-1)
最好使用gets()
,然后尝试解析并将输入的字符串转换为所需类型。
因为所有内容最初都是作为字符串输入的,所以更容易处理错误的输入。
scanf要求输入是完美的,并且当人类输入数据时并不总是这样。