首页 文章

scanf正在收集错误的输入

提问于
浏览
-1
#include<stdio.h> 
 int main(void)
 {
      double c;
      scanf("%f", &c);
      printf("%f", c);
 }

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

3 回答

  • 3

    您需要使用 "%lf" 进行双倍 .

    这是clang编译器发出的警告 .

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

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

  • 1

    the output尝试%lf而不是%f

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

    您使用的是 %f ,它用于常规 float 数据类型 . 既然你已经指定了 double ,你需要使用 %lf ,它是长浮点数 . 它读了一个双 . 希望这能帮助你 .

  • 0

    “%f”是双精度的(或至少一个)正确格式 . 浮点数没有格式,因为如果你试图将一个浮点数传递给printf,它将在printf接收到它之前被提升为double1 . “%lf”在当前标准下也是可接受的 - 如果后面跟着f转换说明符(等等),则l被指定为无效 .

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

相关问题