scanf函数格式输入与隐藏bug问题

今天在写函数的时候,将一个scanf("%d",&choose) 函数放入进一个循环体,调参时,当我输入一个英文字符,因为我设定的格式符号要求是int型,所以输入是一个错误的格式,当输出后,奇怪的事情就发生了,循环体开始无限循环(使用的do{}while();)。然后整个人是懵逼的。一个格式错误就让循环无限重复了?(说不定这也是一种带开发的神奇用法,这个就当作一种隐形bug吧)。

然后使用打印,搞清楚输入后存储在choose是一个怎样的数值,结果打印输出的choose显示为0;

printf("%d\n",choose);  0

那零是一个比较有意思的符号,有两种可能,当我输入字母时,scanf()将错误的字符输入到choose中,但我们知道scanf输入格式错误的时候,并不是这样的机制,所以0就是choose的初始值而已。

然后开始考虑的是缓冲区的滞留。滞留就在scanf();下加个getchar()好咯。

此时问题解决了一半,程序不无限循环了。另一半是我输入得字母有几个,循环进行几次,在这样调试后程序就变得非常人性化了。

然后我多加了几个getchar()。发现加几个就会少几次循环,比如加两个,我输入得是qqq,就循环一次。问题解决

添加一行while((num =getchar() ) != '/n')

问题就非常得人性化了。

问题得深入:

出现这种问题的原因是错误输入的内容会保留在输入流,下一次判断会从输入流开始读取,因为错误输入的内容还在,所以直接判断错误,继续循环。这是可以使用ffush(stdin)来清理输入流。或者使用getchar()接受错误的字符。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潘多拉的面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值