C语言scanf死循环解决方案
博客专区 > JoshSone 的博客 > 博客详情
C语言scanf死循环解决方案
JoshSone 发表于8个月前
C语言scanf死循环解决方案
  • 发表于 8个月前
  • 阅读 22
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: 在写一个C的扫雷小程序时,总是死循环,查找资料后整理于此,交流分享

室友说一个小学弟写了一个扫雷程序,拿来给我看,尼玛,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

 

共有 人打赏支持
粉丝 5
博文 62
码字总数 32794
×
JoshSone
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: