利用while(getcahr()!='n')消除缓冲区非法数据

前言

在刷题过程中,看到实例程序中使用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'消耗掉。

posted @ 2022-02-20 15:25  ghbuff  阅读(716)  评论(0编辑  收藏  举报