getchar的使用

1.从缓冲区读走一个字符,相当于清除缓冲区2.前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’(输入完s[i]的值后按回车键所致),所以如果不在此加一个getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误3.getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和…

大家好,又见面了,我是你们的朋友全栈君。

1.从缓冲区读走一个字符,相当于清除缓冲区  
  
2.前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’(输入完s[i]的值后按回车键所致),所以如果不在此加一个
getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误  
  
3.  
getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab)  
getchar()使用不方便,解决方法:   
(1)使用下面的语句清除回车:   
while(getchar()!=’\n’);   
(2)用getche()或getch()代替getchar(),其作用是从键盘读入一个字符(不用按回车),注意要包含头文件<conio.h>  
  
4. 
getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接
读取了,第一次getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读
取了。  
实际上是 输入设备->内存缓冲区->程序getchar    
你按的键是放进缓冲区了,然后供程序getchar    
你有没有试过按住很多键然后等一会儿会滴滴滴滴响,就是缓冲区满了,你后头按的键没有存进缓冲区.    
键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果
有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到’\n’.要理解这一点,之所以你输入的一系列字符被依次读出
来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一
个字符.如果需要取消’\n’的影响,可以用getchar();来清除,这里getchar();只是取得了’\n’但是并没有赋给任何字符变量,所以不
会有影响,相当于清除了这个字符.还要注意的是这里你在键盘上输入ssss看到的回显正是来自于getchar的作用,如果用getch就看不

到你输入了什么.

 

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

getchar的使用

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

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

getchar的使用

它的输出是1。

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

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

getchar的使用

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

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

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、程序正常结束。

首先,用getchar()函数进行字符的输入,并不是直接从键盘这个硬件中读取输入的字符,而是从“输入缓冲区”中得到的字符。
输入缓冲区是一个字符的队列,其中存储了所有你尚未读取的字符。
每次调用getchar函数,它就会从输入缓冲区中读出第一个字符,并把这个字符从输入缓冲区中清除。
然而,这个输入缓冲区的设计,是把所有从键盘上输入的东西都放进去的,包括你每次按的回车符‘\n’,
而getchar函数只读走了你在回车前输入的那个字符,而将回车符保留在了输入缓冲区中。
于是,第二次调用getchar时,函数就从输入缓冲区中读出了’\n’。
要解决这个问题,有两种可行的途径。
一是多加一个getchar(),过滤掉回车,但是这种方法有不足,就是如果你在调用第一个getchar时输入了多个字符,
那么,加入一个getchar并不能把所有未读取的字符过滤。如果你的本意是重新从“键盘”读取的话,最好是加一个
fflush(stdin);
清除输入缓冲区

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/125274.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 录取为2021年同济大学秋季博士研究生(电子与信息工程学院计算机科学与技术)

    录取为2021年同济大学秋季博士研究生(电子与信息工程学院计算机科学与技术)本来不想回忆往事,读博路上有点坎坷!!遇人不淑,时运不济,还好也遇到一些特别好的老师!同学帮忙。非常感谢这些老师的帮忙。首先是2020年10月份,我硕士生博导朱老师,告诉我他没博士招生名额,但有资格,这个吉大计算机比较特殊,每年博导重新排名,一年一考核,按照分来分博士名额,我老师最后一名,院长副院长有要两个名额的!这里面不方便多说,最后就是我老师今年21招不了博士,到我这卡壳一年,也特别遗憾没能读朱老师的博士。接下来沉沦了两天,10月10号左右吧,开始疯狂联系吉大别的博导,还好联系了几位,其中一z姓老

  • 电脑爱好者——投稿与稿费指南

    电脑爱好者——投稿与稿费指南一、稿件投到哪里?请参照期刊最近一期中各栏目每页页眉上的投稿信箱或责编信箱。投稿信箱依此为准,杂志上的责编信箱是法定的投稿信箱,稿件一定要根据内容,投对栏目。二、投稿格式如何?正文用TXT格式,若有图片须标明图号。图片直接抓为无损的BMP格式或高画质JPG格式并打包压缩为ZIP作为附件发送。无论新老作者,稿件正文末尾均要注明作者详细联系信息和通讯地址。三、稿费标准如何?稿费一般

  • 安装kafka eagle监控kafka集群

    安装kafka eagle监控kafka集群

  • OpenCV实现SfM(二):双目三维重建[通俗易懂]

    OpenCV实现SfM(二):双目三维重建[通俗易懂]使用OpenCV3.0实现双目三维重建,原理清晰,实践有效。

  • 省赛准备阶段

    省赛准备阶段

  • mysql 主键自增语句_MySQL 自增主键[通俗易懂]

    mysql 主键自增语句_MySQL 自增主键[通俗易懂]以下仅考虑InnoDB存储引擎。自增主键有两个性质需要考虑:单调性每次插入一条数据,其ID都是比上一条插入的数据的ID大,就算上一条数据被删除。连续性插入成功时,其数据的ID和前一次插入成功时数据的ID相邻。自增主键的单调性为何会有单调性的问题?这主要跟自增主键最大值的获取方式,以及存放位置有关系。如果最大值是通过计算获取的,并且在某些情况下需要重新获取时,会因为最新的数据被删…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号