使用C语言中的scanf函数读取双精度浮点数

66

我尝试使用C语言的scanf()读取两个值,但系统写入内存中的值与我输入的值不相等。这是代码:

double a,b;
printf("--------\n"); //seperate lines
scanf("%ld",&a);
printf("--------\n"); 
scanf("%ld",&b);
printf("%d %d",a,b);
如果我输入1和2,CMD返回一个正确的结果,但是b=-858993460。这是我已经尝试过的方法:使用float或int代替double,使用scanf_s,使用scanf("%d或%f代替%i或%li或%lf或%e或%g"),使用fflush(stdin)清除键盘缓冲区,先读入变量b,尝试所有可能的组合方式。我发现在32位操作系统上double类型长度存在问题,所以必须使用scanf("%lf", &f)来读取double类型。无论我做什么,第二个值总是错误的。
我在Windows 7 32位操作系统上使用MS VS Express 2012 for Desktop。

1
回滚到版本3,因为更改导致答案难以理解。 - alk
7个回答

132

使用 %lf 格式说明符来读取一个双精度数:

double a;
scanf("%lf",&a);

维基百科有一个不错的参考文献,其中列出了可用的格式说明符。

您还需要使用%lf格式说明符来打印结果:

printf("%lf %lf",a,b);

1
已经尝试过了,只对第一个值起作用,第二个仍然是错误的。 - user1880009
4
虽然我很喜欢维基百科,但是对于提问者来说,一本不错的基础C语言书可能会是更好的建议。(+1) - NPE
1
@user1880009,你仍在使用%d格式说明符来打印结果。这导致只有4个字节的双精度数被读取并解释为整数。你需要在这里也使用%lf格式说明符。我已经更新了我的答案来展示这一点。 - simonc
3
在C99中添加了%lf用于打印double,如果你想兼容旧版本的C,则可以使用%f,它将同时打印floatdouble - M.M
2
告诉自己:%lf = Long Float = double - iBug
显示剩余3条评论

7
据我所知,%d表示十进制数字,即没有小数点的数字。如果您想加载双精度值,请使用%lf转换(长浮点数)。对于printf,由于同样的原因,您的值是错误的,%d仅用于整数(可能是字符,如果您知道自己在做什么)数字。
示例:
double a,b;
printf("--------\n"); //seperate lines
scanf("%lf",&a);
printf("--------\n"); 
scanf("%lf",&b);
printf("%lf %lf",a,b);

3

您在使用%ld的格式序列时出错了,应该使用%lf代替:

double a;
scanf("%lf",&a);

1
printf中,格式说明符应为%f,适用于double数据类型,因为float数据类型最终在printf内部转换为double数据类型。

没有打印float数据的选项。请查看此处的讨论:printf中double的正确格式说明符


虽然这是真的,但问题是关于scanf,它在历史上的行为与printf不同,直到C99才支持%lf。与问题相关的是scanf。 - Lundin

0

正确的方式是:

double a,b;
printf("--------\n"); //seperate lines
scanf("%lf",&a);        //%lf is long float numbers 
printf("--------\n"); 
scanf("%lf",&b);
printf("%f %f",a,b);     //%f float number

1
目前您的回答不够清晰,请[编辑]以添加额外细节,有助于其他人理解如何解决提出的问题。您可以在帮助中心找到有关编写良好答案的更多信息。 - Community
//%lf代表长浮点数 - Cristi G.

0

在扫描第二个值时,请使用此行代码:scanf(" %lf", &b);,并将所有的%ld替换为%lf。

这是一个与输入流缓冲区相关的问题。您还可以在第一次扫描后使用fflush(stdin)来清除输入缓冲区,然后第二个scanf将按预期工作。另一种方法是在第一次scanf行之后放置getch();或getchar()函数。


-5

使用 %lf 可以帮助您解决此问题。

用法:

scanf("%lf",&doub)

这个答案有哪些新的/不同的地方?相同的内容在4年前已经发布过了。 - P.P

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