scanf循环 c语言,C语言scanf死循环解决方案

室友说一个小学弟写了一个扫雷程序,拿来给我看,尼玛,300多行代码都写在一个main函数里,我真的是#@#@FUCK,忍不了,想了一想,扫雷无非就那么几个功能,写个无页面的也挺容易的吧,撸起袖子就是干,其实对于一个小新手来说,写个扫雷还是很费脑细胞的,毕竟也没有什么参考价值的代码,尤其是扫雷中有一个很神奇的功能,就是你运气好的话,点一个位置,没准半个屏幕都被点开了,玩的时候的确感觉很爽,自己做起来真的有种#@#@的感觉

这是我最初的写的代码,当时的想法就是输入数字选择难度,如果输入的数字超出范围那么就提示用户重新输入数字:

while (num!=1&&num!=2&&num!=3) {

printf("请选择难度 1.初级 2.中级 3.高级\n");

scanf("%d",&num);

}//while

测试时无论输入多少,总是能很正确的运行,想也没多想就继续敲代码,一气呵成一晚上把代码敲的七七八八,每个小部分都进行过测试,也没什么问题,心想可算能休息休息,睡个觉了吧

但是似乎事情发展的太顺利,总是会给你搞点事情

这次程序在毫无征兆的情况下,死循环了···

printf("请选择难度 1.初级 2.中级 3.高级\n");

printf("请选择难度 1.初级 2.中级 3.高级\n");

printf("请选择难度 1.初级 2.中级 3.高级\n");

printf("请选择难度 1.初级 2.中级 3.高级\n");

printf("请选择难度 1.初级 2.中级 3.高级\n");

···

···

满屏幕的printf("请选择难度 1.初级 2.中级 3.高级\n"); MD,裤子都脱了,你给我看这个?(确实裤子脱了准备上床睡觉了)

又检查了几遍代码,发现没什么问题,看控制台发现,原来自己一不小心输入了非法字符,输了一个字母

那么问题来了,为什么输入了一个非法字符之后,每次循环都直接跳过我写的scanf("%d",&num);直接输出了呢?

为了解决这个问题,我默默的打开了Safari,在度娘上搜索关键字(原谅我不会google),发现相关问题还是挺多了,大体的意思就是说scanf有缓存区,当输入非法字符,会存放在scanf的缓存区,下次调用scanf函数时,会直接从缓存区读取非法字符,所以就会造成死循环。

解决方案就是,用一个变量来取出缓存区的全部数据,这样下次调用scanf函数时,就会从控制台接收,问题也就解决了!

while (num!=1&&num!=2&&num!=3) {

printf("请选择难度 1.初级 2.中级 3.高级\n");

scanf("%d",&num);

char c;

do{scanf("%c",&c);}while(c !='\n');

}//while

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值