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