标题:关于scanf()的输入验证问题。
只看楼主
凤凰院凶假
Rank: 2
来 自:春天里
等 级:论坛游民
威 望:1
帖 子:36
专家分:33
注 册:2016-12-22
结帖率:83.33%
已结贴  问题点数:30 回复次数:7 
关于scanf()的输入验证问题。

使用scanf读取数字,当输入值是英文或其他字符时,就无限循环了,使用scanf("%f", &u) != 1为什么没有用。百度了解决办法,说是用getchar()函数舍去。但我想知道无限循环的原因,请各位大佬指点。
程序代码:

while (scanf("%f", &u) != 1)
    {
        printf("Please correct number,such as 2.5,-1.78E8,or 3 \n:");
        //while (getchar() != '\n');
    }


搜索更多相关主题的帖子: scanf 输入 验证 无限 getchar 
2017-12-03 11:27
a1669532329
Rank: 1
等 级:新手上路
威 望:1
帖 子:5
专家分:0
注 册:2017-12-3
得分:0 
scanf("%f",&1)!=1  是可以的; 因为是“%f” 所以只能接受数字  如果成功接受到数值则scanf的返回值是1 失败是0  所以当你输入数字的时候scanf 返回的是1,1==1 所以循环判断不成立, 如果是字母则返回0  所以将继续循环。
2017-12-03 11:58
凤凰院凶假
Rank: 2
来 自:春天里
等 级:论坛游民
威 望:1
帖 子:36
专家分:33
注 册:2016-12-22
得分:0 
回复 2楼 a1669532329
你可能没懂我的意思,我所说的无限循环是指,这样:



死循环,不受控制的。
2017-12-03 12:16
a1669532329
Rank: 1
等 级:新手上路
威 望:1
帖 子:5
专家分:0
注 册:2017-12-3
得分:0 
原因不是说了么 就是因为scanf只读取一次 二不是每次循环的时候输入一次  所以第一次是字母就直接是死循环的
2017-12-03 13:17
a1669532329
Rank: 1
等 级:新手上路
威 望:1
帖 子:5
专家分:0
注 册:2017-12-3
得分:0 
如果你把scanf放循环体内就可以了  也不用getchar
2017-12-03 13:22
nslookup65
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:24
专家分:192
注 册:2017-12-1
得分:30 
当输入缓冲区非空时scanf不再请求输入,因为scanf是从输入缓冲区匹配结果的,当缓冲区已有了数据所以就没有必要再次请求输入了。
你输入英文或其他字符到了输入缓冲区,而scanf并没有匹配到结果,因而缓冲区内的数据一直存在,所以导致了死循环。在scanf之后加上 fflush(stdin),就可以清空输入缓冲区,进行下一次的 scanf 输入了。
2017-12-03 14:34
a1669532329
Rank: 1
等 级:新手上路
威 望:1
帖 子:5
专家分:0
注 册:2017-12-3
得分:0 
回复 6楼 nslookup65
牛逼!!
2017-12-03 16:22
凤凰院凶假
Rank: 2
来 自:春天里
等 级:论坛游民
威 望:1
帖 子:36
专家分:33
注 册:2016-12-22
得分:0 
回复 6楼 nslookup65
昨天试过fflush(stdin),没起作用,刚刚又查了下,发现我的编译器(vs)不支持这个函数。

不过很感谢你的解释,让我对scanf()和缓存区有了新的认识。



2017-12-04 08:15



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-483058-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021468 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved