文章目录

  • 一、getchar( ) 函数定义
  • 二、函数返回值
  • 三、注意区分 getchar 和 scanf
  • 四、getchar 的使用实例

一、getchar( ) 函数定义

getchar() - 字符输入函数,没有参数,从输入缓冲区里面读取一个字符 - 「 一次只能读取一个字符 」
EOF(-1) - end of file 文件结束标志 - 键盘上用 ctrl + z 实现

先查一下文档


二、函数返回值

该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读取错误,则返回 EOF(-1)。所以 getchar() 函数返回值要用 int 整型变量来存储

#include<stdio.h>
int main()
{int ch = 0;while ((ch = getchar()) != EOF){putchar(ch);}return 0;
}

运行结果:键盘上输入 abc\n,程序会在屏幕上输出 abc\n,输入 def\n,屏幕上会输出 def\n,当按下 ctrl + z 时程序结束运行

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

为啥用缓冲区呢?因为计算机CPU的处理速度是很快的,我们用键盘输入速度比不上CPU的处理速度,CPU就得等键盘输入完,很浪费资源,所以,当键盘输入完了,让CPU一次性处理,可以大大提高效率。

参考文章:getchar的使用


三、注意区分 getchar 和 scanf

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

// scanf多组输入,s,比如2008 6,使用下面语句,直到遇到'\n',停止读取
while(scanf("%d", &n) != EOF) { }

四、getchar 的使用实例

再来看一个和 getchar() 函数相关的实例:模拟密码输入

#include<stdio.h>
int main()
{char password[20] = { 0 };//输入密码printf("Input password:");scanf("%s", password);//确认密码printf("Comfirm password(Y/N):");int ch = 0;ch = getchar();//判断是否确认成功if (ch == 'Y'){printf("success!\n");}else{printf("defeat!\n");}return 0;
}

运行结果:

输入密码 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

需要写一个循环来读取处理掉无用的字符

修改后的代码如下:

#include<stdio.h>
int main()
{char password[20] = { 0 };//输入密码printf("Input password:");scanf("%s", password);//---清理缓冲区---int temp = 0;while ((temp = getchar()) != '\n'){;}//确认密码printf("Comfirm password(Y/N):");int ch = 0;ch = getchar();//判断是否确认成功if (ch == 'Y'){printf("success!\n");}else{printf("defeat!\n");}return 0;
}

运行结果:

C语言:getchar( ) 函数详解相关推荐

  1. C语言 getchar()函数详解

    getchar()函数机制 getchar()函数实际上是int getchar(void),所以它返回的是ASCII码,所以只要是ASCII码表里有的字符它都能读取出来.在调用getchar()函数 ...

  2. c语言memset对应java,C语言memset函数详解

    C语言memset函数详解 memset() 的作用:在一段内存块中填充某个给定的值,通常用于数组初始化与数组清零. 它是直接操作内存空间,mem即"内存"(memory)的意思. ...

  3. R语言which函数详解以及Rcpp改写

    R语言which函数详解以及Rcpp的改写 引言 which 函数的介绍 which函数的一些小例子 1 2 which函数的改进以及时间对比 引言 首先来介绍一下R语言which函数的作用:whic ...

  4. 【C语言】函数详解(入门到进阶)

    目录 前言 一.什么是函数 二.函数的构成 三.函数的调用和声明 四.函数的参数 五.函数的递归 总结 写在后面 前言 最近帮家里的小朋友整理一些学习C语言的知识点 有整体入门基础文章--[C语言]拯 ...

  5. [C语言] scanf 函数详解多组输入法和gitee 自荐

    自荐 gitee>>> C语言学习练习: C语言学习练习 上面是我的gitee C语言仓库链接,欢迎大家来看看我写的代码.!(◦˘ ³(♡ŐωŐ♡)(给大家推荐gitee(码云)这个 ...

  6. C语言strlen函数详解

    strlen函数详解 一.strlen函数简介 1.函数原型 2.注意事项 二.strlen函数模拟实现 1.计数器方式 2.递归实现 3.指针-指针实现 一.strlen函数简介 1.函数原型 si ...

  7. C语言scanf函数详解

    函数名: scanf  功 能: 运行格式化输入  用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设 ...

  8. c语言 指针函数 详解,[NOTE-C]C语言指针详解(一)

    C语言指针让一切想法变成可能,强转和指针可以看做一项呼风唤雨的利器,但是C语言中指针应用又需要格外的小心,其更灵活的利用内存,因为不当的应用可能引起各种异常,这篇文章就是让我们一起来认识C指针,更好的 ...

  9. C语言scanf函数详解和示例

    文章目录 一.数据输入 二.断章取义 三.scanf输入 1.输入整数 2.输入字符 3.输入浮点数 4.输入字符串 5.输入多个内容 6.示例(book13.c) 四.注意事项 五.获取视频教程 六 ...

  10. c语言string函数详解

    linux kernel code :  kernel/lib/string.c strsep,strtok,strchr ,strstr ...... PS:本文包含了大部分strings函数的说明 ...

最新文章

  1. 简解Css - 多变的边框
  2. 前端学习(1298):gulp使用
  3. 基于短文本的食源性疾病事件探测技术
  4. 汉化:Blocs for Mac(可视化网页设计工具)4.5.0
  5. python——基于Pandas读取asc文件并保存为csv格式
  6. 数据结构-顺序表基本操作-C语言代码
  7. 1000瓶水10只小白鼠问题-面试题目
  8. 线结构光平面方程自动标定
  9. vc语言c1083错误,VC Fatal Error C1083的几种解决方案
  10. cubic与bbr性能实测
  11. 腾讯云服务器高性能云盘和SSD云硬盘区别及选择
  12. 十大面试问题解惑,秒杀一切HR、技术面试。程序员必读! 最能体现求职者能力的就是面试,能不能拿到Offer,取决于你面试时的表现,只有有准备才能在面试过程中游刃有余。小编收集了10个面试官最爱提的问题
  13. 大数据正在改变我们的生活
  14. GameBoy系列(一):基本参数
  15. 基于遗传算法(GA)进化的小游戏
  16. 反向交易: 圣杯还是危险的假象
  17. laravel身份证验证_简单的Laravel登录身份验证
  18. 【mycat】mycat相关概念
  19. [775]小象学院--爬虫知识点总结
  20. 10G SFP+ DWDM光模块的优势是什么?

热门文章

  1. 广义速度V与管理理论——流水线、TPS…
  2. 紫外线测光仪的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  3. (5)将一个数组中的值按逆序重新存放。例如原来顺序为8,6,5,4,1。要求改为1,4,5,6,8
  4. 由于磁盘坏道导致的系统卡顿令我抓狂
  5. recover 没有捕获异常_Go的异常处理defer, panic, recover以及错误处理
  6. Arcmap做地形地貌图流程
  7. 类似携程,飞猪机票列表滚动的日期带价格
  8. Word2016怎么制作目录
  9. 费马大定理与费马小定理
  10. html中svg修改背景颜色,如何更改SVG图像中的背景颜色?