关于getchar函数缓冲区的问题

简介:

最近,看到有同学问我关于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>
运行结果:

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



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

目录
相关文章
|
2月前
|
C语言
[字符串和内存函数]strcmp和strncmp以及memcmp的区别
[字符串和内存函数]strcmp和strncmp以及memcmp的区别
36 0
|
18天前
|
存储
文件的顺序读写——顺序读写函数——fgets、fgetc、fputs、 fputc
文件的顺序读写——顺序读写函数——fgets、fgetc、fputs、 fputc
27 0
|
2月前
getchar()&putchar()函数
getchar()&putchar()函数。
11 1
|
7月前
getchar() & putchar() 函数
getchar() & putchar() 函数。
112 2
|
9月前
|
存储 数据安全/隐私保护
scanf函数读取数据 & 清空缓冲区
scanf函数读取数据 & 清空缓冲区
197 0
|
11月前
|
缓存 数据安全/隐私保护 程序员
getchar函数输入与缓冲区
getchar函数输入与缓冲区
108 0
|
11月前
fgets(),strtod(),strnlen(),strcmp()函数记录
fgets(),strtod(),strnlen(),strcmp()函数记录
|
11月前
|
人工智能
scanf函数与getchar函数区别
scanf函数与getchar函数区别
113 0
|
11月前
|
数据安全/隐私保护
getchar()与putchar()函数详解
getchar与putchar其实最基本的作用就是用getchar读取一个字符,再用putchar输出一个字符
128 0