---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、
<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----- -----------------
scanf死循环了呢
今天在做一个要从键盘输入一个数据的小程序时,不小心让我发现了scanf死循环问题。事情是这样的我要判断一个成绩的等级需要从外输入一个成绩数据,本着高鲁棒性的态度,我就为输入的成绩做了一个约束,不符合的需要重新,这自然就用到了while语句。然后呢,当我写好程序之后,我打算l对自己写的这个程序进行测试,本着认真严谨的态度(嘻嘻,自以为学过测试这门课程,向自己炫耀下而已,毛线态度)。所以对数据进行划分等价类测试,但开始时全都是数字,结果还是很满意的(心里想着我还是挺厉害的嘛),在又一次心血来潮,在输入区按了一个字母结果就出现死循环,怎么回事
为什么会出现死循环的呢??不科学啊,不是有scanf在嘛!要等我输入的啊!为什么会死循环。我当时心里就这样想的。代码大概是这样的:
int a = -1;
while(a<0)
{
printf(“-----\n”);
scanf(“%d”,&a);
}
我输入一个b(反正是非数字)结果全是这个------。想不通啊,于是就去问大神们,大神一眼就看出了我的毛病,尼玛输入数据的格式不对(还用你讲,我不知道格式不对),本着虚心的态度继续问为什么呢。哎~大神的世界我不懂,有说的貌似在理的,可惜听不懂。没办法只能自己找百度,还别说这个’度娘‘还真好用,一搜一大把啊。看了一大堆后,又收货啊,好开心啊~
首先我们的了解下scanf的过程,scanf是从输入缓冲区(你输入数据存放的地方)读取你想要的数据。如果不是你想要的,它会跳过这次scanf,而缓冲区中的值也不会消失,会等待留给下一个scanf函数。
int a;
char b;
scanf("%d",&a);
scanf("%c",&b);
printf("a=%d,b=%c\n",a,b);
当输入a,控制台的结果时a=238775,b=a。所以上面我死循环过程:scanf %d 读入数字,当他从输入缓冲区中读取下一个字符不是0~9字符的时候,也就是非数字字符,他就不写入到a这个内存,并且把刚才读的那个字符反退到输入缓冲区中,跳过scanf这行。程序又回到while哪行,到达scanf时,a又会被读取,发现是非数字字符,退回输入缓冲区。所以之后一直在:
读取下一个字符,非数字字符,又反退到输入缓冲区中。。。
读取下一个字符,非数字字符,又反退到输入缓冲区中。。。
读取下一个字符,非数字字符,又反退到输入缓冲区中。。。
结果就死循环了。
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、
<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----- -----------------