前言
在书体过程中,看到实例程序中使用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()函数
功能,引用百度介绍:
- 当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).
- 当用户键入回车之后,
getchar
才开始从stdin流
中每次读入一个字符. - getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.
- 如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说:
- 后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.
假设我们使用getchar()函数
,在键盘输入了PATTT'\n'
。getchar()
的返回值是用户输入的第一个字符'P'
的ASCII码值。
当程序执行到while(getchar()!='\n' )
时,键盘缓冲区中还存放着输入的ATTT'\n'
,所以while循环开始继续利用getchar()函数
读取键盘缓冲区中剩余的字符。
最后当getchar()遇到'\n'
时,while循环结束,此时才把键盘缓冲区中的非法输入字符和'\n'
消耗掉。