scanf 正在收集错误的输入

scanf is collecting the wrong input

 #include<stdio.h> 
 int main(void)
 {
      double c;
      scanf("%f", &c);
      printf("%f", c);
 }

这是我正在尝试编写的程序的摘录,但我对这么简单的东西也遇到了同样的问题。当我 运行 并输入“1.0”时,它会打印出“0.007812”。我看了几个与我相似的问题,但找不到合适的答案。

您需要使用 "%lf" 双倍。

这是来自 clang 编译器的警告。

warning: format specifies type 'float *' but the argument has type 'double *' [-Wformat] scanf("%f", &c);

这里是scanf reference。它的格式是%[*][width][length]specifier。 'floating point number' 的说明符是 f。所以我们用%ffloat x。要读取 double x,我们需要将长度指定为 l。组合格式为 %lf.

"%f" 是双精度数的(或至少一种)正确格式。 float 没有格式,因为如果你试图将 float 传递给 printf,它会在 printf 接收它之前被提升为 double1。 “%lf”在当前标准下也是可以接受的——l 被指定为如果后跟 f 转换说明符(以及其他)则无效。

请注意,这是 printf 格式字符串与 scanf(和 fscanf 等)格式字符串显着不同的地方。对于输出,您正在传递一个值,当作为可变参数传递时,该值将从 float 提升为 double。对于输入,您传递的是一个未提升的指针,因此您必须告诉 scanf 您想要读取浮点数还是双精度数,因此对于 scanf,%f 表示您想要读取浮点数,%lf 表示您想要读取一个双精度(并且,对于它的价值,对于一个长双精度,您将 %Lf 用于 printf 或 scanf)。

the output尝试使用 %lf 而不是 %f

#include<stdio.h>

int main()
{
double c;
scanf("%lf",&c);
printf("%lf",c);
return 0;
}

您使用的是 %f,它用于常规 float 数据类型。 由于您指定了 double ,因此您需要使用 %lf ,它是长浮点数。它读一个双。 希望对你有帮助。