59

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

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 or %f for %i or %li或 %lf 或 %e 或 %g ),使用 fflush(stdin) 清除键盘缓冲区,首先读取 b ,尝试所有可能的组合。我发现在 32 位操作系统上 double 的长度存在问题,这样你就不得不使用 scanf("%lf", &f) 来读取双精度。无论我做什么,第二个值总是错误的。

我在 Windows 7 32 位操作系统上使用 MS VS express 2012 for Desktop。

4

6 回答 6

116

使用%lf格式说明符读取双精度:

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

维基百科对可用的格式说明符有很好的参考。

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

printf("%lf %lf",a,b);
于 2012-12-05T18:45:32.523 回答
6

据我所知%d,十进制是没有小数点的数字。如果要加载双精度值,请使用%lf转换(长浮点数)。对于 printf,您的值出于同样的原因是错误的,%d仅用于整数(如果您知道自己在做什么,可能还有字符)数字。

例子:

double a,b;
printf("--------\n"); //seperate lines
scanf("%lf",&a);
printf("--------\n"); 
scanf("%lf",&b);
printf("%lf %lf",a,b);
于 2012-12-05T18:46:00.463 回答
3

您使用了错误的格式顺序double,您应该使用%lf而不是%ld

double a;
scanf("%lf",&a);
于 2012-12-05T18:45:48.387 回答
1

格式说明符printf应该%f用于doubl数据类型,因为数据类型float最终会转换为double内部的数据类型printf

没有打印float数据的规定。请在此处找到讨论: 在 printf 中为 double 更正格式说明符

于 2017-06-11T16:50:56.780 回答
0

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

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

于 2020-03-15T08:25:55.283 回答
-3

使用%lf将帮助您解决这个问题。

采用 :

scanf("%lf",&doub)
于 2016-11-23T10:05:37.830 回答