关于scanf()读取与返回值和回车键的问题
今天老师检查的时候说如果一个链表为空(简单的说就是while(scanf())一开始没输入数字就按回车的话会进入死循环)的情况,
我当时有点懵,因为文档里强调为空的情况。还好老师叫我自己现场实现一下,
当时想了两个方案:
*一是用getchar()接受第一个回车(我设定的输入回车结束),如果用户第一个键盘输入就是回车,它能工作的很好。
但是当第一个键盘输入不是一个回车的时候,就遇到一个问题:getchar()会吃掉第一个数字
的一部分,之所以说一部分是因为经过我测试发现:
Getchar()能返回的值最大为57,这显然是不合理的。
于是我想到了第二个方法:
*先用getchar读取,如果getchar读取的不是回车,就将它重新放回缓冲区,再又scanf()函数来
读取。但是这个方案有点麻烦,还要区查资料,搞明白怎么将读取的数据重新放回缓冲区。好的
是在我采取这个方案之前我想到了更好的办法:
第三个办法:
*将结尾判断改一下直接上图,待会解释原理
我对这个函数做了两处改动,第一个和第三个箭头。
第一个改动是把Enter键改成了q键,因为回车会刷新缓冲区,而scanf()函数一直在等待一个数字,
所以在一开始狂按回车是没用的,解决方案就是把回车换成一个字符(q可以代表quit,所以用q,
其他字符也可以)。程序遇到用户输入的q时,图片中函数里的u等于0,所以退出whlie语句。
第二个改动是在两个while语句之间加了一个getchar(),他的作用是:当用户输入q时,第一个while
里面的scanf函数是没有读取到这个q的,,如果没有这个getchar,那么用户输入的q将由第二个
scanf函数来读取。这样第二个while 语句就不会运行。
这样,程序就能满足输入为空表的情况了。
最新文章
- 【推荐】CentOS安装Tomcat-7.0.57+启动配置+安全配置+性能配置
- NOIP2000单词接龙[DFS]
- Windows Phone Foreground Toast
- cat常用参数详解
- 普林斯顿结构 VS 哈佛结构
- zw版_zw中文增强版Halcon官方Delphi例程
- JSAPI_Ticket签名
- ZeroR-baseline分类器
- MTD设备驱动
- Springboot 入门之Hello World
- NYOJ-1057 寻找最大数(三)(贪心)
- python实例编写(1)--浏览器操作,元素操作
- 《从Paxos到Zookeeper:分布式一致性原理与实践》【PDF】下载
- 从集合的无序性看待关系型数据库中的";序";
- nginx location的命中过程
- android布局##TableLayout和FrameLayout-android学习之旅(十五)
- 创建servlet的三种方式
- Python 爬虫 当当网图书 scrapy
- 启动Cognos时报0106错误
- Mybatis自定义SQL拦截器