关于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 语句就不会运行。
这样,程序就能满足输入为空表的情况了。
关于scanf()读取与返回值和回车键的问题的更多相关文章
- 关于scanf函数的返回值问题
如: scanf("%d%d",&a,&b); 1.如果a和b都被成功读入,则scanf的返回值为2 2.如果只有a被成功读入,那么返回值为1 3.如果a和b都未被 ...
- scanf printf函数返回值
1. scanf 函数是有返回值的,它的返回值可以分成三种情况 1) 正整数,表示正确输入参数的个数.例如执行 scanf("%d %d", &a, &b); ...
- scanf函数的返回值
#include <stdio.h> int main() { ]; ]); printf("%d\n", n); ; } 此刻注意scanf函数里面的格式限定,该代码 ...
- scanf返回值问题
在家养病,闲着没事看C primer plus,看到书中对于scanf输入的判断,常用如下方法: 此时它将返回1视为我输入成功,如果不为1则视为输入失败.那到底scanf的返回值具体指的是什么呢? 例 ...
- SqlDataReader 获取存储过程返回值
编写存储过程,获取不到返回值 附上代码: SqlDataReader reader = null;// totalRecords = ; try { SqlConnectionHolder conne ...
- go中defer的理解--defer、return、返回值之间执行顺序
defer可以读取有名返回值 func c() (i int) { defer func() { i++ }() return 1 } 输出结果是2. 在开头的时候,我们知道defer是在return ...
- fwrite()的返回值随着格式的不同返回值也不同;
常用地函数fwrite fwrite()的返回值随着格式的不同返回值也不同: 也是最近涉及到代码才注意到的,汗!!! 转载了一篇文章来说明这个问题:文章地址:http://blog.csdn.net/ ...
- printf与scanf的返回值、注意点
printf()的返回值为其输出字符串常量的字符数(注意字符数与字数的区别)注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符). scanf()函数返回成功读入的项目的个数 ...
- scanf和cin的返回值
需要连续从标准输入读取数据时,可以采用下面两种不同的方式判断文件结束: [cpp] view plaincopy int i; while(scanf("%d",&i) ...
随机推荐
- Vue-cli 构建项目后 npm run build 如何在本地运行查看
当你在本地直接打开index.html 你会发现了一丢丢404,这时候你有两个办法解决问题: 1:改变路径为相对路径. 在config 文件夹中index.js的 build对象里, 把 assets ...
- GitHub发卡系统zfaka配置历程
GitHub发卡系统zfaka配置历程 1项目介绍 ZFAKA发卡系统(本系统基于yaf+layui开发) 项目地址 https://github.com/zlkbdotnet/zfaka 我 ...
- 教你如何快速定制 SpringBoot banner
之前说过如何快速创建SpringBoot项目,不知道的同学可以查看之前的文章 5分钟学会如何创建spring boot项目. 为了让大家脱单,码哥简直费尽心思,今天这个技能或许可以让你脱单! 今天我们 ...
- Android数据绑定DataBinding(一)入门篇
早上看到了一篇推文"还在使用繁琐的findViewById,跟着尝试了一下DataBinding,之前使用ButteKnife就已经干掉了findViewById.因为写过微信小程序,那种在 ...
- 如何从DOS命令窗口进行复制粘贴
在DOS窗口没有右键复制按钮,那我们如果想要进行复制粘贴该如何操作呢?本篇就来说明一下这个操作流程. 工具/原料 WIN7系统 方法/步骤 按“WIN+R”调出运行页面,在其中输入CMD然 ...
- flutter doctor出现问题 [!] Android toolchain - develop for Android devices (Android SDK version 28.0.3) X Android license status unknown. Try re-installing or updating your Android SDK Manager. 的解决方案
首先,问题描述: flutter doctor Doctor summary (to see all details, run flutter doctor -v): [√] Flutter (Cha ...
- Flutter移动电商实战 --(53)购物车_商品列表UI框架布局
cart_page.dart 清空原来写的持久化的代码; 添加对应的引用,stless生成一个静态的类.建议始终静态的类,防止重复渲染 纠正个错误,上图的CartPage单词拼错了,这里改过来防止后面 ...
- vue - 设置全局html背景
需求 有时候有些组件需要全局设置body背景,有些不需要在组件中设置就行了 解决思路 1. 全局设置可以是html,body,这里大家可以试一下,这两个只要其中一个设置了background,另一个的 ...
- HTML5 地理位置定位API(5)
HTML5 Geolocation API (地理位置应用程序接口) 目前PC浏览器支持情况: Firefox 3.5+Chrome 5.0+Safari 5.0+Opera 10.60+Intern ...
- 微软代码示例:ASP.NET 2.0 三层架构应用程序教程系列
本文转自:http://www.codeusing.com/hi/uephee.wen/resource/view/170.aspx 资源分类:微软代码示例 更新日期:20 ...