免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1269 | 回复: 0

scanf读取输入的问题 [复制链接]

论坛徽章:
0
发表于 2009-11-16 19:53 |显示全部楼层
呵呵,今天碰到有个同事玩C语言,写了个小程序,在一个循环中用scanf读输入,结果造成了死循环..
想起来自己以前也碰到过类似的问题,不过一时忘了怎么解决,查了一下,记下来吧..
问题大概是由类似于下面的程序造成的:
do
{
    printf("input:");
    scanf("%d",&a);
}while(a  100);//本意是在读取到的a小于100时,让用户继续输入
在输入非法的时候(如输入一串字母),这部分代码会进入死循环,也就是说,scanf下次并没有从stdin读取输入,而是直接从某个地方读取了某值,直接向下执行.造成这
个问题的原因是scanf在读到非法输入的时候,会返回0,而且非常输入会被保存在缓冲区中,下次会直接从缓冲区中读取,因此造成了死循环.
因此解决的办法是检查scanf的返回值,并且在有非法输入时将非法输入的部分读出来,清空缓冲区.
解决的代码如下:
do
{
    printf("input:");
    if(scanf("%d",&a) != 1)
    {
        while(getchar() != '\n')//将缓冲区的数据读出来
        {
            //noop
        }
        continue;//要求用户继续输入
    }
}while(a
windows下貌似还可以用fflush(stdin)直接将输入缓冲区清空,不过linux下没用。
如果我写的话,我会用fgets全部读取用户的输入,然后自己从中提取自己想要的数据。然而中国所有的学生在学C的时候,全是用scanf开始的,其实,我们对scanf了解的太少了。。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/17287/showart_2096180.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP