方法1
使用 fflush(stdin)
fflush(stdin)
优点:使用这种方法清除缓冲区,简单快捷,只需将这条语句放入程序的输入语句的前面。
缺陷:但是这个方法有很大缺陷,因为在c语言得标准中没有明确规定这种用法,所以并不是所有的编译器都支持。
如果编译器支持,那么清除缓冲区就很简单了。
如果编译器不支持,它并不会报错,只是执行完这条语句后,缓冲区的内容依然存在。
方法2
使用getchar()
getchar() 是带有缓冲区的,每次从缓冲区中读取一个字符,包括空格、制表符、换行符等空白符,只要我们让 getchar() 不停地读取,直到读完缓冲区中的所有字符,就能达到清空缓冲区的效果。请看下面的代码:
int c;
while((c = getchar()) != '\n' && c != EOF);
该代码不停地使用 getchar() 获取缓冲区中的字符,直到遇见换行符\n或者到达文件结尾才停止。
当知道需要清除的字符个数时也可如之前所示直接使用getchar()
方法3
使用scanf()清空
scanf() 还有一种高级用法,就是使用类似于正则表达式的通配符,这样它就可以读取所有的字符了,包括空格、换行符、制表符等空白符,不会再忽略它们了。并且,scanf() 还允许把读取到的数据直接丢弃,不用赋值给变量。
请看下面的语句:
scanf("%*[^\n]"); scanf("%*c");
第一个 scanf() 将逐个读取缓冲区中\n之前的其它字符,% 后面的 * 表示将读取的这些字符丢弃,遇到\n字符时便停止读取。此时,缓冲区中尚有一个\n遗留,第二个 scanf() 再将这个\n读取并丢弃,这里的星号和第一个 scanf() 的星号作用相同。由于所有从键盘的输入都是以回车结束的,而回车会产生一个\n字符,所以将\n连同它之前的字符全部读取并丢弃之后,也就相当于清除了输入缓冲区。