关于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>

运行结果:

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

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

时间: 2024-10-15 05:29:46

关于getchar函数缓冲区的问题的相关文章

C语言#getchar()函数

1.getchar()的作用 getchar()函数的作用是从缓冲区读入一个字符的数据,第一次读取数据getchar()会等待用户键入ENTER然后开始从缓冲区进行读取数据,如果缓冲区的数据大于1个字节,剩下的数据会暂时存储在缓冲区,getchar会依次进行读取,而不需要用户再次输入ENTER来触发读取. getchar()的返回值是一个整型的数据,其值对应字符的ASCII码. 2.统计输入空格数量的小程序 1 #include<stdio.h> 2 3 main() { 4 5 int n;

getch()、getche()和getchar()函数

getch().getche()和getchar()函数(1) getch()和getche()函数  这两个函数都是从键盘上读入一个字符.其调用格式为:  getch();  getche();  两者的区别是:getch()函数不将读入的字符回显在显示屏幕上,而getche() 函数却将读入的字符回显到显示屏幕上.       例1:        #include"stdio.h"       #include"conio.h"       void main

c语言:用getchar函数读入两个字符给c1,c2,用putchar和printf输出。思考问题

用getchar函数读入两个字符给c1,c2,分别用putchar和printf输出这两个字符.思考以下问题: (1)变量c1和c2定义为字符型还是整型?或二者皆可? (2)要求输出c1和c2的ASCII码,应如何处理? (3)整形变量和字符变量是否在任何情况下都可以互相代替?char c1, c2;和int  c1, c2;是否无条件等价? 程序: #include<stdio.h> int main() { char c1, c2; printf("请输入两个字符c1,c2:&q

小议getchar()函数

函数原型: int scanf(constchar*format,...); 该函数定义在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>.它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中. 函数 scanf() 是从标准输入流stdio (标准输入设备,一般是键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中. 其调用形式为: scanf("<格式说明字符串>",&

&lt;C&gt; getchar()函数 以及如何把getchar()到的字符串存起来的实际应用

一.getchar() 1.返回值:返回读到的ASCⅡ码值 2.使用方法: 1 #include<stdio.h> 2 3 int main() 4 { 5 char c; 6 while((c = getchar()) != '\n') 7 { 8 printf("%c",c); 9 } 10 11 return 0; 12 } 3.功能:从输入缓冲区中读取一个字符 是一个阻塞函数(目前了解就好 后面应该有机会学到这方面的知识) 二.如何把getchar()到的字符串存起

同时使用scanf()函数和getchar()函数的陷阱

函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息. 函数名:getchar 功能:从计算机终端(一般是键盘)输入一个字符. 同时使用者两个函数时,会有陷阱,代码如下: #include <stdio.h> int main(void) { char buff[20],ch; int num,i=0; printf(&quo

C语言编程之--scanf()函数与getchar()函数搭配来理解C程序的输入缓存(buffer)

博主最近在学习C语言编程,在书中的代码示例中出现了下面的代码段: #include<stdio.h> int main() { char a[5]; int i; printf("请依次输入值:\n"); for(i=0;i<5;i++) { scanf("%c",&a[i]); getchar(); //为什么要加一个getchar()? } printf("\n"); for(i=0;i<5;i++) { pr

opengl一些基础函数-- 缓冲区

void glGenBuffers(GLsizei n, GLuint *buffers); //在buffers数组中返回当前n个未使用的名称,表示缓冲区对象 GLboolean glIsBuffer(GLuint buffer); //判断是否是缓冲区对象 void glGenBuffers(GLsizei n, GLuint *buffers); //在buffers数组中返回当前n个未使用的名称,表示缓冲区对象 GLboolean glIsBuffer(GLuint buffer); /

Linux C 字符函数 getchar()、putchar() 与 EOF 详解

首先给出<The_C_Programming_Language>这本书中的例子: #include <stdio.h> int main() { int c; c = getchar(); while (c != EOF) { putchar(); c = getchar(); } return 0; } 这里主要解释下为什么要用int型来接受getchar函数. 很多时候,我们会写这样的两行代码: char c; c = getchar(); 这样就很有可能出现问题.因为getc