getchar()所起的清空行作用

while (getchar() != ‘\n’) continue;清空行作用的原理:
下面程序代码实现的功能是输入一个字符和两个数字,第一个数字表示显示字符的行数,第二个数字表示每行显示字符的个数
代码一:
getchar()所起的清空行作用_第1张图片
这段代码能够实现功能,但只能使用一次,一次后就打印Bye了。
代码二:
getchar()所起的清空行作用_第2张图片
getchar()所起的清空行作用_第3张图片这段代码能够实现功能并且能够重复使用。经过分析和查阅资料后整理如下:(1)当程序调用getchar()函数时,程序就等着用户按键,用户输入的所有字符(包括空格、换行符、制表符等符号)被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar()函数才开始从键盘缓冲区中每次读入一个字符。也就是说,后续的getchar()函数调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才重新等待用户按键。(注意,getchar()函数的返回值是int类型。)
(2)getchar()会逐个读取每一个字符,包括空格、换行符和制表符。scanf()读数字时,会跳过空格、换行符和制表符。
(3)所以,在代码一中,当读完
getchar()所起的清空行作用_第4张图片后,结果应该是putchar(‘\n’)在缓存中留下一个换行符。所以再次回到主函数中进行第二次while循环时,getchar()会读到这个换行符(getchar()不会跳过这个换行符),从而使程序不满足while((ch=getchar())!=‘\n’)的条件(相当于getchar()把换行符赋值给了ch,使得括号内条件为假),进而跳出while循环,所以该程序只能执行一次就结束了。
(4)在代码二中,在执行完display函数回到主函数后,加入了while (getchar() != ‘\n’) continue;这段代码。由上一点知道,display函数最后会在缓存中留下一个换行符。
while (getchar() != ‘\n’) continue;语句的意思是getchar()把字符从缓存区取出后,执行一段空语句。如果取出的字符不是换行符getchar()将一直读取,一直丢弃,直到清空缓存区。
而又因为getchar()本身并不能存储,若要比较某个位置的字符与特定字符的关系,则应及时赋值变量,储存响应。所以getchar()在读取到换行符之前的字符时,并没有存储这些字符(没有赋值给变量),而是都被丢弃掉了。
当读到display函数留下的换行符后,不满足while的循环条件(使得括号内条件为假),因此会跳出while循环。读取到的这个换行符因为没有赋值给其他变量进行保存,所以最终也会被丢弃掉。而换行符一般是缓存中最后一个字符,它被读取后,缓存中就没有其他字符了。这就是while (getchar() != ‘\n’) continue;起到清空行作用的原理。

你可能感兴趣的:(C,c语言)