黑马程序员 scanf死循环了呢

本文详细探讨了使用scanf函数时出现死循环的原因,通过分析输入缓冲区的作用,解释了为何非数字输入会导致无限循环,并提供了理解及解决该问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------- <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>、期待与您交流! ----- -----------------


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值