1、首先,我们看一下这段代码:

它的简单意思就是从键盘读入一个字符,然后输出到屏幕。理所当然,我们输入1,输出就是1,输入2,输出就是2。

那么我们如果输出的是12呢?

它的输出是1。

这里我们先简单的解释下,因为当我们从键盘输入字符‘1’,‘2’,并按下回车后,我们的输入被放入了输入缓冲区,这个时候getchar()会从缓冲区中读取我们刚才的输入,一次只读一个字符,所以字符1就被拿出来了,赋值给了c,然后putchar()又将c放在了标准输出,也就是这里的屏幕,所以我们看见了最终的显示结果1。同时字符‘1’也被缓冲区释放了,而字符‘2’仍然被留在了缓冲区。而这样是很不安全的,有可能下次使用的时候,我们的缓冲区会读到一些垃圾,但是当程序结束的时候,它会自动刷新。

2、我们接着看下面的代码:

大家觉得这几行代码是什么意思呢?大家是否真的看懂了呢?

如果你觉得你看懂了,那么我提一个问题,你觉得是不是你从键盘输入一个字符就会输出一个字符,直到遇见了换行符呢?

emmmmm。

如果你真的这么想了,那你就错了。

它真正的运行过程应该是这样的:还记得我们刚才说过的东西吗,getchar()会从输入缓冲区去读取内容,也就是说我们把所有的内容都输入完成并且按下了Enter键后,我们的输入才被送进去了输入缓冲区,这个时候,while循环才开始工作,每一次getchar()从输入缓冲区读取一个字符,然后如果不是换行符就输出。

3、那么我们为什么要使用缓冲区呢?

举个例子,我们知道计算机CPU的处理速度很快的,而我们键盘的输入速度总是比不过CPU的处理速度,那么CPU就得一直等着键盘输入完,这样很浪费资源。于是,我们党键盘输入完了,再让CPU一次性处理,这样就会大大地提高效率。

又比如,我们的打印机打印文档,打印机的处理速度是很慢的,所以我们会将文档输出到打印机的缓存中去,这样打印机就可以自行慢慢打印,而不必占用CPU资源。

4、缓冲区的类型

  缓冲区 分为三种类型:全缓冲、行缓冲和不带缓冲。

  1、全缓冲

  在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。

  2、行缓冲

  在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是键盘输入数据。

  3、不带缓冲

  也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。

5、缓冲区的刷新

缓冲区会在以下三种情况下被刷新:

1、缓冲区满

2、执行flush刷新缓冲区的语句

3、程序正常结束。
---------------------
作者:lws123253
来源:CSDN
原文:https://blog.csdn.net/lws123253/article/details/79848373
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/jack-hzm/p/10059231.html

详解getchar()函数与缓冲区相关推荐

  1. 一分钟详解initUndistortRectifyMap函数bug修复方法

    本文首发于微信公众号「3D视觉工坊」--一分钟详解initUndistortRectifyMap函数bug修复方法 在上一篇文章OpenCV中initUndistortRectifyMap函数存在bu ...

  2. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...

    本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...

  3. 详解虚函数的实现过程之菱形继承(5)

    大家看到标题,会不会菱形继承的虚表会不会是重复的呢?祖父类的虚表会不会在子类会不会是两份相同呢?那么我们一起来探索一下吧,冲冲冲!! 首先我们来分析一下: 它一共定义了四个类,分别为CFurnitur ...

  4. 详解虚函数的实现过程之虚基类(4)

    博客虚函数实现过程3 时提到过虚基类,这里呢,我们来详细讲述一下: 当我们在虚函数的声明结尾处添加"=0",这种虚函数就被称为纯虚函数. 它好似一个没有实现只有声明的函数,它的存在 ...

  5. 详解虚函数的实现过程之多重继承(3)

    下面来一起探索一下多重继承时,有虚函数会怎么继承呢? 这里大家猜一下,SofaBed会占多少个字节呢? 首先我们是不是得猜一下它有几个虚表指针? 4* 4(4个int数据)+2*4(两个虚表指针)=2 ...

  6. 详解虚函数的实现过程之单继承(2)

    从汇编分析一下下面的多态模拟结构 利用 父类指针指向子类的特性,可以间接调用各子类中的虚函数. 虽然指针类型为父类,但由于虚表的排列顺序是按虚函数在类继承层次中首次声明的顺序依次排列的,因此,只要继承 ...

  7. 详解虚函数的实现过程之初探虚表(1)

    空对象它有一字节的大小,在没有任何成员变量但是却有虚函数的对象里,它的大小是四个字节,这是为什么呢? 因为含有虚函数的对象里,对象的起始地址往后四个字节其实是 一个指针,它指向了一个数组,这个数组的元 ...

  8. 详解Scala函数也是对象的特性

    详解Scala函数也是对象的特性

  9. python函数中可变参数的传递方式是_详解Python函数可变参数定义及其参数传递方式...

    Python函数可变参数定义及其参数传递方式详解 python中 函数不定参数的定义形式如下 1. func(*args) 传入的参数为以元组形式存在args中,如: def func(*args): ...

最新文章

  1. 3D惯导Lidar仿真
  2. setTimeOut()和setInterval()的用法
  3. java集合-HashSet源码解析
  4. Linux系统的磁盘管理
  5. 新年彩蛋:Spring Boot自定义Banner
  6. 信息学奥赛一本通(1157:哥德巴赫猜想)
  7. 广告文案被指侮辱女性 茶颜悦色道歉:立即召回相关产品
  8. 复数乘法_初学讲义之高中数学十八:复数
  9. matlab自带同步电机数学模型,永磁同步电机的数学模型及方程
  10. android9 mate10,华为仅这四部手机升到安卓9.0,Mate10和P20用户窃喜!
  11. Druid连接池(一)
  12. FaceWarehouse 3DMM形状拟合
  13. 全息投影技术及其实现(附素材下载)
  14. 【随机过程】【研究生考试专用】备考笔记/知识点整理
  15. ubuntu系统镜像文件下载
  16. b站首页banner景深移动特效 bilibili秋
  17. 一篇文章基础HTML总结
  18. 解决linux“嘟嘟”的报警声
  19. gcc命令行选项说明
  20. 塑料疑云还是认知返祖?从荣耀9X看大小手机厂商之间的天堑

热门文章

  1. php-v 查看不到版本,解決php -v查看到版本於phpinfo()打印的版本不一致問題
  2. 个人信息管理系统代码_Thymeleaf+SpringBoot+Mybatis实现的易游网旅游信息管理系统...
  3. java调用外联服务用xml,Spring IOC 依赖注入的两种方式:XML和注解
  4. python正则r的作用_Python正则表达式,这一篇就够了!
  5. java弹出虚拟键盘_JS实现电脑虚拟键盘的操作
  6. Character.isLetterOrDigit(ch)判断ch是否为字母或数字
  7. java拆装_JAVA线性表拆解
  8. requests 分类多级页面_scrapy框架爬取多级页面
  9. 观察者模式Java实现
  10. StringTokenizer将一个字符串分解为单词或者标记