[C语言] 混合or连续使用getchar,scanf所出现的错误

getchar

getchar()的作用是从系统隐含指定的输入设备(即终端键盘)输入一个字符,按回车键表示输入结束。

测试getchar的具体用法

getchar()每次只能读取一个字符,我们知道如果我们一次性输入多个字符,getchar()只会读取第一个字符,剩余的字符保存到标准缓冲区里
我们用于测试的源代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{char a,b;printf(" Please press a key and then press enter:");a=getchar();printf(" You pressed:");putchar(a);printf("\n Please press a key and then press enter:");b=getchar();printf("\n You pressed:");putchar(b);}
INPUT:abc
OUTPUT:Please press a key and then press enter:abcYou pressed:aPlease press a key and then press enter:You pressed:b

可以看到程序直接跳过了第二条getchar()的输入而取出标准缓冲区里的b输出
如果我们只输入一个字符呢?
我们以为程序应该是这样的情况

Please press a key and then press enter:a
You pressed:a
Please press a key and then press enter:_

光标停留在第二个getchar()等待我们输入第二个值,然而实际情况却是这样的

INPUT:
a
OUTPUT:
Please press a key and then press enter:a
You pressed:a
Please press a key and then press enter:
You pressed:

程序仍跳过了第二个getchar()直接结束了,看似好像第二个getcher()既没输入又没输出而程序就这样结束了
其中的原因就在于getchar()是从标准缓冲区中读取输入的字符的,所以像上面那样写的情况下,字符型变量b接收的就是输入a之后输入的回车键

我们可以经行如下测试来消除那个回车键

  1. 通过增加一个getchar()抵消回车键;
    char a,b;printf(" Please press a key and then press enter:");a=getchar();printf(" You pressed:");putchar(a);getchar();printf("\n Please press a key and then press enter:");b=getchar();printf(" You pressed:");putchar(b);
  1. 用 fflush(stdin);语句来清空缓存区;
    char a,b;printf(" Please press a key and then press enter:");a=getchar();printf(" You pressed:");putchar(a);fflush(stdin);printf("\n Please press a key and then press enter:");b=getchar();printf(" You pressed:");putchar(b);

用fflush(stdin);语句的作用可不仅仅能消除回车键,他能消除存在缓冲区里的所有字符,性质优良

INPUT:abczxc
OUTPUT:Please press a key and then press enter:abcYou pressed:aPlease press a key and then press enter:zxcYou pressed:z

scanf

scanf的作用是按指定格式要求和数据类型,读入若干数据给的相应的变量
借用我们用来测试getchar的代码稍作改动,其得到的结果与getchar一样

    char a,b;printf(" Please press a key and then press enter:");scanf("%c",&a);printf(" You pressed:");printf("%c",a);printf("\n Please press a key and then press enter:");scanf("%c",&b);printf("\n You pressed:");printf("%c",b);
  1. scanf的改进方式除了上面两种还可以通过改第二个scanf("%c",&b);变成
    scanf(“Space%c”,&b);用Space来抵消掉那个回车键;
  2. 我们采取用%*c的方式消除回车键等修饰符;
    char a,b;printf(" Please press a key and then press enter:");scanf("%c",&a);printf(" You pressed:");printf("%c",a);scanf("%*c");printf("\n Please press a key and then press enter:");scanf("%c",&b);printf(" You pressed:");printf("%c",b);

但上述是字符型的变量,现在我们对int型变量经行测试

    int a,b;printf(" Please press a key and then press enter:");scanf("%d",&a);printf(" You pressed:");printf("%d",a);printf("\n Please press a key and then press enter:");scanf("%d",&b);printf(" You pressed:");printf("%d",b);
INPUT:1224
OUTPUT:Please press a key and then press enter:12You pressed:12Please press a key and then press enter:24You pressed:24

这样的情况是我们见的最多的,经行两次输入
又如果这样

INPUT:12 24
OUTPUT:Please press a key and then press enter:12You pressed:12Please press a key and then press enter: You pressed:24

预料之中

混合使用getchar和scanf

    int a,b;printf(" Please press a key and then press enter:");a=getchar();printf(" You pressed:");putchar(a);printf("\n Please press a key and then press enter:");scanf("%d",&b);printf(" You pressed:");printf("%d",b);

效果跟前面基本相似,就是注意getchar只能读取一个字符
然而

INPUT:ab
OUTPUT:Please press a key and then press enter:aYou pressed:aPlease press a key and then press enter:bYou pressed:8

通过debug窗口,我们可以看到8是b的初始化随机数据,如果在初始化的时候int b=0;第二个press出来的就是0 ,这是怎么回事呢?
我们注意到scanf("%d",&b);当输入类型与制定的数据类型不统一时,将无法经行数据输入

本人小菜一枚,学识浅薄,言辞简陋,如有不正确或是可以改进之处,欢迎大家指出,小生不胜感激!

[C语言] 混合or连续使用getchar,scanf所出现的错误相关推荐

  1. 汇编和c语言混合编程缺点,汇编C语言混合编程经验总结

    ARM汇编语言和C语言混合编程 ATPCS规灾了一种模块化设计的观念,其基本内容是C模块(函数)和汇编模块(函数)相互的一套规?中还有类似的一套规晕腋芯谙呋惚喙δ芮看用有很多忌讳),厅知道(很寄几它/ ...

  2. 基于R语言混合效应模型(mixed model)案例研究

    全文链接: http://tecdat.cn/?p=2596 在本文中,我们描述了灵活的竞争风险回归模型.回归模型被指定为转移概率,也就是竞争性风险设置中的累积发生率(点击文末"阅读原文&q ...

  3. MPB:扬大林淼组-​瘤胃混合细菌连续传代培养技术

    为进一步提高<微生物组实验手册>稿件质量,本项目新增大众评审环节.文章在通过同行评审后,采用公众号推送方式分享全文,任何人均可在线提交修改意见.公众号格式显示略有问题,建议电脑端点击文末阅 ...

  4. jvm字节码和基于jvm的多语言混合编程

    字节码 IT领域的三大难题 CPU OS 编译器 多语言混合编程 如何搞懂jvm <自己动手写java虚拟机>作者使用的是go语言,比较投机取巧,因为go语言有比较完整的垃圾回收机制,如果 ...

  5. go语言和python结合_Go+Python双语言混合开发-第1章 【阶段一:Go语言基础】

    1-1 Go+Python双语言混合开发-课程导学 (11:35) 1-2 课程资源获取方式 - 非常重要!!! (06:07) 1-3 课程中需要用到的开发环境介绍 (03:47) 1-4 wind ...

  6. 简述arm汇编和c语言混合编程,ARM汇编C语言混合编程

    3.4 ARM汇编&C语言混合编程 3.4.1 C内联ARM汇编 先看一个例子: # cat add.c 1 // add.c for s3c2410c board 2 // arm-linu ...

  7. python中连续两个小于号_Python语言描述最大连续子序列和

    求最大连续子序列的和是一个很经典很古老的面试题了,记得在刚毕业找工作面试那会也遇到过同款问题.今儿突然想起来,正好快到毕业季,又该是苦逼的应届生们各种面试的时候到了,就给写了一些小代码解决这个问题.也 ...

  8. arm汇编和c语言混合编程实验报告,arm实验ARM汇编和C语言混合编程.doc

    arm实验ARM汇编和C语言混合编程.doc 成绩辽宁工程技术大学上机实验报告课程名称汇编语言程序设计基于ARM体系结构实验题目ARM汇编和C语言混合编程院系软件学院专业软件工程班级姓名学号实验日期实 ...

  9. VS2017的C#语言与matlab2014A的m语言混合编程的方法

    VS2017的C#语言与matlab2014A的m语言混合编程的方法 摘要: 有两种方法能够实现C#语言调用matlab编写的函数:一种是利用matlab应用类型库直接调用matlab函数:另一种是将 ...

  10. ARM汇编和C语言混合编程中数组的数组的操作

    ARM汇编和C语言混合编程中数组的数组的操作 此示例描述a数组中的元素累加的结果,c和b交换的实例: 代码块 例如: #include <stdio.h>int main (int arg ...

最新文章

  1. 王家豪:求实探索,青春无问西东;脚踏实地,奋斗自成芳华 | 提升之路系列...
  2. 网络对抗技术-实验报告一
  3. MyBatis-Plus 通用IService的使用
  4. TODO:Go语言goroutine和channel使用
  5. 2.2 string
  6. sublime python插件配置_sublime text 3 + python配置,完整搭建及常用插件安装
  7. CSRF - 跨站请求伪造
  8. ci.php教程,CodeIgniter
  9. 军事训练飞机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  10. FFMPEG之音频播放
  11. 中国渠道销售管理模式特点分析
  12. 零基础入门学习Python(21):魔法方法(1)构造和析构
  13. Hashcat 使用教程
  14. 第127讲:Hadoop集群管理之安全模式解析及动手实战学习笔记
  15. HMM算法详解(内含推导)
  16. 谷粒商城项目总结(一)-基础篇
  17. vue订餐app,使用vue-router
  18. hgame week1 2021 pwn
  19. SAP中预制凭证简单应用分析测试
  20. 数图互通高校房产公房管理主要有哪些功能呢?

热门文章

  1. 荣耀手机两个android文件夹,华为手机文件管理中,这几个文件夹可以任意删除,其他的千万不要乱删!...
  2. 2019/9/10谷歌开发者大会汇总
  3. 什么是文本分析,文本分析主要运用到了哪些关键技术?
  4. 中南OJ 2012年8月月赛 I题 Imagination
  5. 记:应聘赛意 测试工程师
  6. 网络流行语“不作不死”英文入选美国词典
  7. 流媒体后视镜方案关键技术--调节后视图像显示范围
  8. mac打开注册机显示“您没有权限来打开应用程序
  9. 用 DiskGenius 和 HDD Regenerator 修复硬盘逻辑坏道和隐藏物理坏道
  10. h5页面可以获取安卓和ios平台,可获取手机类型,但是不能获取手机型号