码迷,mamicode.com
首页 > 其他好文 > 详细

关于getchar函数缓冲区的问题

时间:2016-03-15 14:55:24      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:

最近,看到有同学问我关于getchar()这个函数缓冲区的问题,结合我以前的学习,我将对getchar()进行一次总结,当然,这些都是别人已经提过的东西,我只是总结,接下来我们来看看。

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

来个例子吧:

<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	printf("\n pls input num:\n");
	char ch ,sh ; 
	ch = getchar();
//	fflush(stdin);
	sh = getchar();
	printf("\n out put:\n");
	putchar(ch);
	putchar('\n');
	putchar(sh);
	return 0 ;
}</span>
运行结果:

技术分享

我们看到,第二个getchar并没有获取到相应的字符,而只是获取了一次就输出了。

我们把注释去掉看看:

<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	printf("\n pls input num:\n");
	char ch ,sh ; 
	ch = getchar();
	fflush(stdin);
	sh = getchar();
	printf("\n out put:\n");
	putchar(ch);
	putchar('\n');
	putchar(sh);
	return 0 ;
}</span>
运行结果:

当输入缓冲区被刷新以后,那么就可以连续输入两次,并且都输出啦!

技术分享

总结:输入有缓冲区,输出也是有缓冲区的,这个问题,往后咱们再讨论

关于getchar函数缓冲区的问题

标签:

原文地址:http://blog.csdn.net/morixinguan/article/details/50890525

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!