文档章节

C语言scanf死循环解决方案

JoshSone
 JoshSone
发布于 2017/05/17 09:43
字数 800
阅读 31
收藏 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语言。在看书的过程中发现范例程序都没有对用户输入数据类型的合法性进行判断。于是依据仅有的知识写了如下代码: #include void main() /用户必须输入数字/{float x;short a;printf(...

change
2011/04/14
161
2
scanf和getchar接收EOF的时候为什么不一样呢

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

吃水的鱼
2016/02/01
132
1
关于循环链表的问题,解决约瑟夫环

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

伊诗塔
2012/09/05
521
6
c语言基础学习04_条件判断语句

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

黑泽明军
2017/12/25
0
0
C语言嵌入式系统编程修炼之软件架构篇

这是我13年前创作和发表在互联网上的文章,这么多年过去了,这篇文章仍然在到处传播。现在贴回Linuxer公众号。 全文目录: C语言嵌入式系统编程修炼之道——背景篇 C语言嵌入式系统编程修炼之...

jus3ve
2017/12/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

71.告警系统主脚本 配置文件 监控项目

20.20 告警系统主脚本(main.sh) 20.21 告警系统配置文件 20.22 告警系统监控项目 20.20 告警系统主脚本(main.sh): ~1.约定:把以后所有的shell脚本放在/usr/local/sbin下,也方便我们查...

王鑫linux
8分钟前
0
0
装饰者模式

装饰者模式 Q:何为装饰模式? ()地给一个对象添加一些额外的(),并且()时,并不影响原对象。扩展功能来说,装饰器模式相比生成子类更为灵活。 Q:使用场景? 1.想要在不影响其他对象的情况下...

阿元
28分钟前
0
0
GO 切片(slice)相关语法

package mainimport("fmt")func main() {var intArr [5]int = [...]int{1,2,3,4,5} //定义一个数组slice := intArr[2:4] //第二个(包含)下标到第四个下标(不包含)fmt.Println...

汤汤圆圆
30分钟前
0
0
活动招募 HUAWEI HiAI公开课·北京站-如何在4小时把你的APP变身AI应用

人工智能和机器学习是全球关注的新趋势,也是当前最火爆、最流行的话题。当你拿手机用语音助手帮你点外卖,智能推荐帮你把周边美食一网打尽;当你拿起P20拍照时,它将自动识别场景进行最美优...

华为终端开放实验室
44分钟前
1
0
匹配两位小数,js正则

var regex = /^\d*(\.[1-9]|\.\d[1-9])*$/ console.log(1.2,regex.test(1.2)); console.log(0.3,regex.test(0.3)); console.log(1.03,regex.test(1.03)); ......

微信小程序-暗潮
49分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部