详解getchar()函数与缓冲区

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下python安装Numpy、Scipy、matplotlib模块

python 2.7 针对2.7的软件。numpy :http://sourceforge.net/projects/numpy/files/NumPy/1.8.1/ 下载下面的numpy-1.8.2-win32-superpack-python2.7 scipy: http://sourceforge.net/projects/scipy/files/matplotlib:matplotlib-1.1.0.win32-py2.7 以上都是exe文件&#xff0…

restTemplate使用和踩坑总结

日常工作中肯定会遇到服务之间的调用,尤其是现在都是微服务的架构,所以总结一下restTemplate的最常用的用法以及自己踩过的坑。 restTemplate的使用 restTemplate底层调用的是Execute方法,而Execute底层调用的是doExecute,它是基于…

常见编码总结

本文总结自:https://blog.csdn.net/zmx729618/article/details/51821024 1. ISO 8859-1 字节数:1 范围:0-255(编码范围是0x00-0xFF),其中0x00-0x7F之间完全和ASCII一致(ASCII是7位编码&#xff…

启动一个Java进程

windows版本 startup.bat -------------------------------------------------------- rem --------------------------------------------------------------------------- rem Start SMS Server by zhangjin rem --------------------------------------------------------…

Flask框架从入门到精通之参数配置(二)

知识点: 1、参数配置 一、概况 上一篇我们已经把Flask第一个程序运行起来了,那么这一篇主要讲一下Flask参数的配置。 二、配置参数 Flask参数配置方式有很多种,每一种都可以达到结果,在合适的场景选择合适的配置方式。 配置文件 在…

BP神经网络python简单实现

BP神经网络的原理在网上有很详细的说明,这里就不打算细说,这篇文章主要简单的方式设计及实现BP神经网络,并简单测试下在恒等计算(编码)作测试。 BP神经网络模型图如下 BP神经网络基本思想 BP神经网络学习过程由信息的…

golang的reflection(转)(一)

2019独角兽企业重金招聘Python工程师标准>>> 反射reflection 可以大大提高程序的灵活性,使得interface{}有更大的发挥余地反射可以使用TypeOf和ValueOf函数从接口中获取目标对象信息反射会将匿名字段作为独立字段(匿名字段的本质)…

idea教程--Maven 骨架介绍

简单的说,Archetype是Maven工程的模板工具包。一个Archetype定义了要做的相同类型事情的初始样式或模型。这个名称给我们提供来了一个一致的生成Maven工程的方式。Archetype会帮助作者给用户创建Maven工程模板,并给用户提供生成相关工程模板版本的参数化…

datatables.js 简单使用--多选框和服务器端分页

说明:datatables是一款jQuery表格插件。感觉EasyUI的datagrid更易用 内容:多选框和服务器端分页 缘由:写这篇博客的原因是datatables的文档写的不怎么样,找东西很麻烦 环境:asp.net mvc , vs2015sqlserver2012 显示效…

python异常(高级) Exception

异常(高级) Exception 异常回顾:     try-except 语句 捕获(接收)异常通知,把异常流程变为正常流程     try-finally 语句 执行必须要执行的语句.     raise 语句 发送异常通知,同时进入异常流程     assert 语句 发送AssertionError异常     with 语句 wi…

反射赋值

目前例子为NPOI Excel导入 入库时调用 var file file1.PostedFile.InputStream;var fileExt System.IO.Path.GetExtension(file1.FileName);IWorkbook workbook;if (fileExt ".xlsx")workbook new XSSFWorkbook(file);elseworkbook new HSSFWorkbook(file);DB.D…

基于PCA(主成分分析)的人脸识别

代码下载:基于PCA(主成分分析)的人脸识别 人脸识别是一个有监督学习过程,首先利用训练集构造一个人脸模型,然后将测试集与训练集进行匹配,找到与之对应的训练集头像。最容易的方式是直接利用欧式距离计算测…

从BMW Vision iNEXT 看宝马如何进军自动驾驶

安全很重要,空间也要很大,砍掉大量物理按键,内饰材料要环保,还要提供自动和主动两套驾驶方案。这些描述仅是BMW Vision iNEXT(下称Vision iNEXT)概念车的设计之冰山一角。 一款概念车当然无法完全代表未来…

CSS浮动(二)---Float

重新认识float 2.1. 误解和“误用” 既然提到“误用”,各位看官就此想想,自己平日是怎么使用float的?另外,既然“误用”加了引号,就说明这样的使用并不是真正的误用,而是误打误撞使用之后,带…

Hadoop0.20.2版本在Ubuntu下安装和配置

1、安装JDK   (1)下载安装JDK:确保计算机联网之后命令行输入下面命令安装JDK   sudo apt-get install sun-java6-jdk   (2)配置计算机Java环境:打开/etc/profile,在文件最后输入下面内容 …

云原生生态周报 Vol. 2

业界要闻 Kubernetes External Secrets 近日,世界上最大的域名托管公司 Godaddy公司,正式宣布并详细解读了其开源的K8s外部 Secrets 管理项目: Kubernetes External Secrets,简称KES。这个项目定义了ExternalSecrets API&#xff…

centos 7新机使用前操作

关闭防火墙 systemctl stop firewalld(停服务) systemctl status firewalld(看状态) systemctl disable firewalld.service (永久关闭) selinux getenforce(查状态) vi /etc/selinux…

ubuntu10.04+hadoop0.20.2平台配置(完全分布式模式)

配置环境及有关工具:ubuntu10.04 、hadoop0.20.2 、 jdk1.6.0_29 我们的机器有三台,一台当作namenode、两台当作datanode: namenode:IP:192.168.0.25、机器名:kiddenzj (这里的机器名要注意:机…

成佛、远不止渡沧海

地之及东南,有一海,称为“沧海”。沧海对面,就是仙家佛地。凡是能渡过沧海到达彼岸的人,就能立地成佛,修成正果。 于是,许许多多的人千里迢迢赶来,或乘帆船,或乘木筏,纷纷…

软件架构演进

传统架构到分布式架构详解 软件架构演进软件架构的发展经历了从单体架构、垂直架构、SOA架构到微服务架构的过程,博客里写到了这四种架构的特点以及优缺点分析,个人学习之用,仅供参考! 1.1.1 单体架构 特点:1、所有的…