scanf正在收集错误的输入
#include int main(void) { double c; scanf("%f", &c); printf("%f", c); }
这是我试图编写的程序的一个漏洞,但是我对这个简单的问题也有同样的看法。 当我运行它并输入“1.0”时,它打印出“0.007812”。 我看过几个与我类似的问题,但找不到合适的答案。
你需要使用"%lf"
来表示双倍。
这是clang编译器发出的警告。
警告:format指定类型’float *’但参数的类型为’double *'[-Wformat] scanf(“%f”,&c);
这是scanf参考 。 它的格式是%[*][width][length]specifier
。 “浮点数”的说明符是f
。 所以我们用%f
来读取float x
。 要读取double x
,我们需要将长度指定为l
。 合并格式为%lf
。
输出 Try%lf而不是%f
#include int main() { double c; scanf("%lf",&c); printf("%lf",c); return 0; }
您使用的是%f ,它用于常规float数据类型。 既然你已经指定了double ,你需要使用%lf ,这是long float。 它读了一个双。 希望这能帮助你。
“%f”是双精度的(或至少一个)正确格式。 浮点数没有格式,因为如果你试图将一个浮点数传递给printf,它将在printf接收到它之前被提升为double1。 “%lf”在当前标准下也是可接受的 – 如果后面跟着f转换说明符(等等),则l被指定为无效。
请注意,这是printf格式字符串与scanf(和fscanf等)格式字符串显着不同的地方。 对于输出,您传递一个值,当作为可变参数传递时,该值将从float提升为double。 对于输入,你传递的是一个未被提升的指针,所以你必须告诉scanf你是要读取浮点数还是双读数,所以对于scanf,%f表示你想要读取一个浮点数而%lf意味着你想要的读取一个double(并且,对于它的值,对于long double,你使用%Lf来表示printf或scanf)。