1. getchar

getchar先读取一个字符放到ch里面去,如果这个字符不等于EOF,就进入循环,打印这个字符。当getchar读到文件末尾或者结束时,它会返回一个EOF,此时结束循环。

输入A,输出A;输入b,输出b…

当我们想要结束时,输入ctrl+Z,再按回车即可。

注意:如果上面的代码不用while循环的话,输入123,putchar()只会输出1。因为一个getchar一次只能读取一个字符。

(1)这是为什么呢,程序的运行过程是这样的,getchar 有一个 int 型的返回值。当程序调用 getchar 时,程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符 \n 也放在缓冲区中),当用户键入回车之后,getchar() 函数才开始从输入缓冲区中每次读取一个字符,getchar 函数的返回值是用户输入的字符的 ASCII 码,若遇到文件结尾 (End-Of-File) 则返回 -1 (EOF),并将用户输入的字符回显到屏幕,如果用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续 getchar 调用读取。也就是说,后续的 getchar 调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键。程序中 while 循环工作时,每一次循环 getchar() 就会从输入缓冲区读取一个字符,然后 putchar 输出,直到遇到了文件结束标志 EOF,循环判断条件为假,循环才结束

(2)我们来看看它其中的原理:

scanf和getchar都是输入函数,它们都是从键盘上来读取我们的数据,但它们不是直接从键盘上来读取我们的数据。它们和键盘之间有一个区域叫缓冲区。

输入函数先来看缓冲区中是否有数据,如果有,它直接就拿走了,不需要从键盘输入,如果缓冲区什么都没有,则需要从键盘输入,再拿走。

2.注意区分 getchar 和 scanf

对于 scanf 函数,'\n' 会触发 scanf 读取输入缓冲区的内容,但遇到 '\n' 或空格 ' ' 会停止读取,而 getchar 会直接读取 '\n' 和空格

3.getchar 的使用实例

输入密码 123456 之后,程序没有让我们确认密码,直接判断确认失败了,为什么会出现这样的结果呢?

当我们在键盘上输入密码并按下回车后,键盘缓冲区有 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ‘\n’ 这些字符,此时 scanf 函数开始读取字符串 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ,遇到 ‘\n’ 结束读取,这时运行到后面的 getchar 函数了,getchar 发现缓冲区里还有一个 ‘\n’ ,直接将其读取走并会返回给整型变量 ch,这时没有多余的 getchar 函数来接收字符 ‘Y’ 或者 ‘N’ 了,轮到 if 语句来判断时,ch 不等于 ‘Y’ ,输出 defeat!

那我们怎么改进,让字符 ‘Y’ 或者 ‘N’ 得以被接收呢,猜你已经想到了,那就是在 ch = getchar(); 语句前面增加一条 getchar(); 语句,来读取处理掉 ‘\n’ ,这样用来确认密码的那个 getchar 函数就可以接收字符 ‘Y’ 或者 ‘N’ 了

继续思考,如果我输入密码时多输了一些无用的字符,又该怎么样处理掉它们呢?比如输入 123456 abcdf\n

很自然就能想到需要先把缓冲区里清空。

那我们就在前面加一个getchar把缓冲区中的“\n”给清理掉。

即代码变为

4、输入的密码中有空格

不过又有一个问题,当我们输入密码为123456 789时(中间有一个空格),还没等我们输入N或Y,又立马跳出了“确认失败”。

这又是怎么回事呢?我们一起来看看

(1)原理详解

首先缓冲区里没有东西,我们需要通过键盘输入密码123456 789,

然后scanf就来取缓冲区中的数据,当它读到空格的时候,它就不再读了(这是scanf的一个作用性质)。

所以scanf就只取走了123456,而缓冲区中还剩下(空格) 789\n。

再往下,运行到getchar();这行代码,然而这里只有一个getchar,它只能读取一个字符,也就是只读了空格,缓冲区中还剩789\n。

再往下,就是我们的这行代码int ch = getchar();

getchar()一来就取走了缓冲区中的7,根本不需要我们从键盘输入N或Y。运行时自然它就自动跳出了“确认错误”。

(2)解决措施

所以我们需要把缓冲区中的东西先全部清走。

那我们就用一个循环,只要没读到\n,我们就一直用getchar读。

getchar与scanf的区别相关推荐

  1. 浅谈getch(),getche(),getchar(),gets(),scanf()的区别

    getch(),getche(),getchar(),gets(),scanf()的区别,综合很多博客的文章. getch()和getchar() getchar()是C的标准库函数,包含在头文件&l ...

  2. 探讨getchar与scanf的区别

    前言 说到scanf与getchar,想必大家都不陌生,在学习C语言的第一天起我们就开始接触它们,但我们对它们在输入方面可能有点模棱两可,分不清scanf与getchar真正有什么区别,下面就来分别探 ...

  3. getchar、scanf以及缓冲区的概念

    1.getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了. getch()和getche()是conio. ...

  4. fgets和scanf的区别

    fgets和scanf的区别 1.测试使用scanf的一个例子: [cpp] view plaincopyprint? #include "stdio.h" #include &q ...

  5. C++中cin、cin.get()、cin.getline()、getline()、gets()、getchar()、scanf()等函数的用法

    转自:https://www.cnblogs.com/luolizhi/p/5746775.html 1.cin>> 用法1:最基本,也是最常用的用法,输入一个数字: #include & ...

  6. 七.getchar 和 scanf

    目录 准备 1.getchar函数 1.1特点: 1.2getchar在缓存区接收字符 代码 显示 原因: 2.scanf 2.1读入字符 代码 显示 2.2读字符串 代码 显示 原因 3.扩展 3. ...

  7. 【C语言】C语言学习整理-putchar,printf,getchar,scanf定义及区别

    1.定义 花一点时间认真阅读,这篇文章应该会让您多理解一点东西. 1.getchar getchar函数是字符输入函数,其功能是从键盘上获取一个输入字符. 读取方式: 从stdio(输入)流中读字符, ...

  8. Gets和scanf的区别

    char s[20]; gets(s); puts(s); gets与scanf输入字符串的方式也非常类似,但是有几个区别: (1) gets的输入分割符只有回车,因此gets是能够读入空格的.如果输 ...

  9. 关于fgetc,getc,getchar和scanf的一些小知识

    在C语言中,一个char类型的字符可以用int型的数参照ASCII表来表示,比如 char ch = 49; printf("%c", ch); 这段代码会输出1,因为字符**'1 ...

最新文章

  1. Quartz2D在项目中的实际使用
  2. SAP PM 初级系列23 - IW22 事务代码里创建维修工单
  3. 容易混淆的php函数,个人笔记
  4. JavaScript实现表单的分向提交
  5. mysql partition 性能_通过分区(Partition)提升MySQL性能
  6. C#开发微信门户及应用(27)-公众号模板消息管理
  7. 【渝粤教育】21秋期末考试宏微观经济学10545k1
  8. js 正则中冒号代表什么_是否还在疑惑Vue.js中组件的data为什么是函数类型而不是对象类型...
  9. 信息系统项目管理师---第八章项目质量管理历年考题
  10. 关于ini读取错误问题?
  11. 计算机找不到WPS云盘,为什么我的电脑里没有WPS网盘入口?开启教程教给你!
  12. 手机电脑怎么上P站-国内版pixiv你可知晓
  13. 删除pdf文档中的批量水印
  14. 年轻人最in的选择!HCK哈士奇x可口可乐联名限量款冰吧
  15. C# 使用winRIng0 填写阿里旺旺2015账号密码及自动登录
  16. FFmpeg —— MP4转FLV(带关键帧)
  17. eclipse中文语言包安装(别看网上那些乱七八糟的,我这个最简单)
  18. Axure RP9基本操作
  19. 免疫20年大发现-Nature Reviews Immunology
  20. android多线程下载3

热门文章

  1. 【NLP】基于Word2Vec词向量的中文文本相似度匹配
  2. Guava API 的使用笔记
  3. 使用MATLAB绘制条形图并填充图案
  4. Linux tar压缩命令:打包与解打包命令
  5. arm64位Win11系统安装FT232R驱动过程
  6. 线性渐变—发廊灯/扫描灯
  7. 20162325 金立清 S2 W7 C16
  8. python变量名包括_python变量命名规则
  9. 使用arduino输出QMC5883L的三轴磁场和YAW角
  10. android开机自启