Chinaunix首页 | 论坛 | 博客
  • 博客访问: 439850
  • 博文数量: 132
  • 博客积分: 2511
  • 博客等级: 大尉
  • 技术积分: 1385
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-11 15:10
文章分类

全部博文(132)

文章存档

2012年(18)

2011年(35)

2010年(60)

2009年(19)

分类: LINUX

2009-11-16 19:53:46

呵呵,今天碰到有个同事玩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 < 100);


windows下貌似还可以用fflush(stdin)直接将输入缓冲区清空,不过linux下没用。

如果我写的话,我会用fgets全部读取用户的输入,然后自己从中提取自己想要的数据。然而中国所有的学生在学C的时候,全是用scanf开始的,其实,我们对scanf了解的太少了。。
阅读(606) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~