C语言 scanf()函数中使用%lf的问题

问题1 输入字母时,输出的x=0,为何x=0时可以跳出for循环?
问题2 第一次输入0后,程序要求重新输入,再输入一个字母时,为何会出现自动无限循环?

不一样的,这么都是格式字符,意义如下:格式字符 意 义 d 以十进制形式输出带符号整数(正数不输出符号) o 以八进制形式输出无符号整数(不输出前缀0) x,X 以十六进制形式输出无符号整数(不输出前缀Ox) u 以十进制形式输出无符号整数 f 以小数形式输出单、双精度实数 e,E 以指数形式输出单、双精度实数 g,G 以%f或%e中较短的输出宽度输出单、双精度实数 c 输出单个字符 s 输出字符串前面加个%,你自己对照下吧 长度:长度格式符为h,l两种,h表示按短整型量输出,l表示按长整型量输出。你这个“%lf”,是在定义输入的类型为double(双精度)是用的,不明白,你可以测试下: #include void main() { double i; scanf("%lf",&i); printf("%f\n",i); } 和 #include void main() { double i; scanf("%f",&i); printf("%f\n",i); } 我这里用了2个编译器分别测试了下,一个如果定义double行,输入的时候必须要用%lf,一个就不用了,用%f也行,但是精度还是有区别的,综合以上,如果定义double型数据,输入最好是用"%lf" .
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-05-21

    输入e导致scanf读取失败,此时x的值是未定义的。

    由于scanf读入失败,未能成功读取的字符e被留在输入缓冲区中;下次循环时,scanf又尝试读取输入缓冲区中的e,自然再次读取失败,因而陷入无限循环。

追问

那为什么直接输入e时不会出现死循环?

追答

由于第一点原因,x的值是不能确定的,所以if(x>0&&x<1000)是否成立也是不能确定的,如果成立,则不会陷入死循环;如果不成立,则陷入死循环。

此时正确的做法是判断scanf的返回值,而不是判断x的值。

for(;;)
{
    int valid = scanf("%lf", &x);
    if(valid==1 && x>0 && x<1000)
        break;
    printf("请输入一个有效的值。\n");
    while(getchar()!='\n'); //清空输入缓冲区
}

追问

您的代码直接输入e后还是会有死循环,我最后加了getchar();后就解决了,感谢!

追答

我已经补充了,在第7行加一行while(getchar()!='\n');即可,刚才忘记写了

本回答被提问者采纳
相似回答