文档章节

C语言scanf死循环解决方案

JoshSone
 JoshSone
发布于 2017/05/17 09:43
字数 800
阅读 43
收藏 0

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

 

© 著作权归作者所有

共有 人打赏支持
下一篇: 队列
JoshSone
粉丝 7
博文 76
码字总数 32794
作品 0
长春
iOS工程师
私信 提问
【已解决】如何在C下通过scanf()函数正确获取所需数据?

开始学C语言。在看书的过程中发现范例程序都没有对用户输入数据类型的合法性进行判断。于是依据仅有的知识写了如下代码: 编译通过;运行时输入任意非数字字符,程序陷入死循环。 该如何解决...

change
2011/04/14
174
2
关于循环链表的问题,解决约瑟夫环

这个代码每次我输入完名字之后就运行不了了,大家帮我解决解决 谢谢;我用的C语言。 /*有N个小孩围成一圈, 给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列, 然后...

伊诗塔
2012/09/05
548
6
scanf和getchar接收EOF的时候为什么不一样呢

我在vs里面测试getchar和scanf的区别,发现对于EOF,两个识别的精度不同,scanf时,使用ctrl+z多次才能中断成功,在getchar时,ctrl+z可以直接成功中断操作,这是为什么呢,而且在使用scanf...

吃水的鱼
2016/02/01
208
1
c语言菜鸟求教!!!!一个关于三角形运行的问题

我是一名大二的学生,大一时没怎麽认证学习,大一第一学期的专业课c语言才刚过(64),所以现在重新自学c语言,我编了一个关于三角形的程序,源程序如下:#include main() { float a,b,c; pr...

Mike.hjxs
2011/10/09
656
3
c语言基础学习04_条件判断语句

============================================================================= 涉及到的知识点有:程序的三种结构、条件分支语句、循环语句、求自然数的和、 求100到999之间所有的水仙花...

黑泽明军
2017/12/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

IDE 插件新版本发布,开发效率 “biu” 起来了

近日,Cloud Toolkit正式推出了面向 IntelliJ 和 Eclipse 两个平台的新款插件,本文挑选了其中三个重大特性进行解读,点击文末官网跳转链接,可查看详细的版本说明。 本地应用一键部署到任何...

阿里云官方博客
14分钟前
1
0
我是怎样和Linux系统结缘并通过红帽RHCE认证的

我高考完当时就是选择的计算机科学与技术专业,上大学以后联想到的和计算机相关的就只有写代码,开发,网站,网页设计,就没有其他的了,当时学习写代码也都是在Windows上,什么C#、C++之类的...

linuxprobe16
15分钟前
0
0
Coding and Paper Letter(四十四)

资源整理。 1 Coding: 1.Rstudio2019年会“机器学习应用”的幻灯片,代码和数据 rstudio conf 2019 2.R语言包sparkxgb,Spark上XGBoost的R接口。 sparkxgb 3.自动SQL注入和数据库接管工具。 ...

胖胖雕
47分钟前
3
0
Ubuntu最新的主要操作系统放弃32位支持?

现在是2018年,2019年即将到来——64位处理器已经成为主流很长一段时间了。如果你仍然使用32位的电脑,那么是时候把它扔进垃圾箱了。 我为所有基于Linux的操作系统维护者感到自豪,他们有勇气...

Linux就该这么学
48分钟前
1
0
Fundebug发布Vue插件,简化BUG监控接入代码

摘要: 代码越短越好! 我们发布了fundebug-vue插件,可以简化Vue框架接入Fundebug的代码。 Vue如何接入Fundebug 1. 安装fundebug-javascript与fundebug-vue npm install fundebug-javascrip...

Fundebug
56分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部