消除键盘缓冲区中多余输入数据

本文详细解释了C语言中getchar()函数的作用,特别是在处理用户输入时如何消除scanf()造成的缓存问题。通过一个实例程序展示了如何使用while(getchar()!=' ')清除多余的输入字符,确保程序正确读取用户输入。同时,文章强调了理解getchar()功能对于正确处理输入数据的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在刷题过程中,看到实例程序中使用while(getchar()!=’\n’)消除回车,刚开始不理解,不明白原理是什么。通过查阅getchar()的功能才慢慢理解。

实例程序

/*
	1-只存在'P', 'A', 'T'三种字符;
	2-'P', 'T'只能出现一次并且按照该顺序先后出现;
	3-P&T之间不能没有A;
	4-T之后A的数量 = P之前A的数量 × P&T中间A的数量。
*/


#include<stdio.h>
#include<string.h>

int main(){
	char c;
	int n,i;
	scanf("%d",&n);
	while(getchar() != '\n');//来清除scanf缓存中的垃圾数据
	for(i=0;i<n;i++){
		int pos=0,count[3]={0};//count标识A在几个位置分别的数量,不能放上面,需要每次循环初始化 
		while((c=getchar())!='\n') {
			if(c=='A')	
				count[pos]++;//统计对应位置的A的数量 
			else if(c=='P'&&pos==0)	
				pos=1;
			else if(c=='T'&&pos==1)	
				pos=2;//保证T出现在P后面且只出现一次 
			else 
				break;
		}
		if(c=='\n'&&pos==2&&count[1]&&count[2]==count[0]*count[1]) {
			puts("YES");
		}
		else 
			puts("NO");	
		if(c!='\n')
            while(getchar()!='\n');//来清除getchar缓存中的垃圾数据
	}
	
	return 0;
}

主要解释下面程序:

while(getchar() != '\n');//来清除scanf缓存中的垃圾数据

解释之前先介绍一下getchar()函数功能,引用百度介绍:

  1. 当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).
  2. 当用户键入回车之后,getchar才开始从stdin流中每次读入一个字符.
  3. getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.
  4. 如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说:
  5. 后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.

假设我们使用getchar()函数,在键盘输入了PATTT'\n'getchar()的返回值是用户输入的第一个字符'P'的ASCII码值。
当程序执行到while(getchar()!='\n' )时,键盘缓冲区中还存放着输入的ATTT'\n',所以while循环开始继续利用getchar()函数读取键盘缓冲区中剩余的字符。
最后当getchar()遇到'\n'时,while循环结束,此时才把键盘缓冲区中的非法输入字符和'\n'消耗掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数智安全屋

非常感谢你的认可!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值