scanf正在收集错误的输入

时间:2017-04-01 02:54:01

标签: c double scanf stdio

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

这是我试图编写的程序的一个例外,但我对这个简单的问题也有同样的看法。当我运行它并输入“1.0”时,它打印出“0.007812”。我看过几个与我类似的问题,但找不到合适的答案。

3 个答案:

答案 0 :(得分:3)

您需要将"%lf"用于双倍。

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

  

警告:format指定类型'float *'但参数的类型为'double *'[-Wformat]     scanf(“%f”,&amp; c);

这是scanf reference。格式为%[*][width][length]specifier。 “浮点数”的说明符为f。因此,我们使用%f来阅读float x。要阅读double x,我们需要将长度指定为l。格式为%lf

答案 1 :(得分:1)

the output尝试%lf而不是%f

#include<stdio.h>

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

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

答案 2 :(得分:0)

&#34;%F&#34;是double的(或至少一种)正确格式。 float没有格式,因为如果你试图将float传递给printf,它会在printf接收到它之前被提升为double1。 &#34;%LF&#34;在当前标准下也是可以接受的 - 如果后面跟着f转换说明符(其中包括),则l被指定为无效。

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