文档章节

C语言scanf死循环解决方案

JoshSone
 JoshSone
发布于 2017/05/17 09:43
字数 800
阅读 27
收藏 0
点赞 0
评论 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
博文 62
码字总数 32794
作品 0
长春
iOS工程师
【已解决】如何在C下通过scanf()函数正确获取所需数据?

开始学C语言。在看书的过程中发现范例程序都没有对用户输入数据类型的合法性进行判断。于是依据仅有的知识写了如下代码: #include void main() /用户必须输入数字/{float x;short a;printf(...

change ⋅ 2011/04/14 ⋅ 2

scanf和getchar接收EOF的时候为什么不一样呢

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

吃水的鱼 ⋅ 2016/02/01 ⋅ 1

C语言常见错误小结

原文链接:http://blog.csdn.net/jaminwm/article/details/90361

晨曦之光 ⋅ 2012/03/09 ⋅ 0

关于循环链表的问题,解决约瑟夫环

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

伊诗塔 ⋅ 2012/09/05 ⋅ 6

C语言嵌入式系统编程修炼之软件架构篇

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

jus3ve ⋅ 2017/12/29 ⋅ 0

c语言菜鸟求教!!!!一个关于三角形运行的问题

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

Mike.hjxs ⋅ 2011/10/09 ⋅ 3

C语言小白最容易犯的17种错误,你中了吗?

C编译的程序对语法检查并不像其它高级语言那么严格,这就给编程大佬们留下了“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对刚刚接触C语言的人来说,经常会出一些连自...

诸葛玥 ⋅ 2017/12/16 ⋅ 0

c语言scanf()的垃圾处理

第一种解决方案:用getchar()清除 scanf("%d", &x);getchar();scanf("%c", &ch); 第二种解决方案:空格 scanf("%d", &x);scanf(" %c", &ch); // 注意空格 第三种解决方案:%*c scanf("%d", &...

wellsguo ⋅ 2014/03/05 ⋅ 0

C语言嵌入式系统编程软件架构篇

模块划分 模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求。C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依...

被使用的文件 ⋅ 2015/12/04 ⋅ 2

C语言经典算法(二)

C语言作为多数工科学校编程入门的教学工具语言,是很多朋友开启编程世界大门的钥匙。今天,承接上一篇C语言经典算法(一),我继续给大家带来C语言经典算法,欢迎大家与小编多多交流。 六、9...

小辰GG ⋅ 2017/11/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

骰子游戏代码开源地址

因为阿里云现在服务器已经停用了,所以上面的配置已经失效。 服务端开源地址:https://gitee.com/goalya/chat4.git 客户端开源地址:https://gitee.com/goalya/client4.git 具体运行界面请参考...

算法之名 ⋅ 28分钟前 ⋅ 0

设计模式--装饰者模式

装饰者模式 定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 通用类图 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比...

gaob2001 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部