方法一:使用fflush(stdin)
在C语言中,fflush()是用来刷新输出缓冲区的函数,但是在输入缓冲区上使用fflush()是未定义的行为,虽然在某些编译器下有用,但是在其他编译器下可能会导致不可预知的行为。
事实上,stdin是一个标准输入流,fflush()函数不会清空stdin的输入缓冲区,如果非要使用fflush()函数来清空输入缓冲区,你可以使用以下方法:
fflush(stdout);
fflush(stderr);
这种方法的本质是强制输出一个换行符,然后清空输出缓冲区,但是同时会清空stdin的输入缓冲区,这种方法并不是很可靠。
方法二:使用getchar()
如果输入缓冲区里有多余的字符没有被处理,可以使用连续的getchar()来清空输入缓冲区,直到遇到换行符或者EOF:
int c;
while((c = getchar()) != '\n' && c != EOF);
这个方法的本质是从输入流中读取一个字符,然后判断是否为换行符或者EOF,如果不是就继续读取下一个字符,直到遇到换行符或者EOF为止。
方法三:使用scanf()
3.1 使用scanf("%*[^\n]')
在使用scanf()函数读取一个字符串时,可以使用scanf("%*[^\n]")来避免读取多余的字符:
char str[20];
scanf("%s", str);
scanf("%*[^\n]");
scanf("%*c");
这个方法的本质是读取一个除了换行符以外的字符串,然后忽略掉输入缓冲区中的所有非换行符字符,最后读取一个换行符并丢弃它。
3.2 使用scanf("%*s")
使用scanf("%*s")可以直接忽略一段字符串的输入:
int num;
scanf("%d", &num);
scanf("%*s");
这个方法的本质是读取一个整数,然后忽略掉输入缓冲区中的一段非换行符的字符串。
方法四:使用fgets()
fgets()函数可以读取一行字符,如果还有多余的字符,可以使用以下方法来清空输入缓冲区:
char str[50];
fgets(str, sizeof(str), stdin);
if(str[strlen(str)-1] != '\n')
while(getchar() != '\n');
这个方法的本质是读取输入流中的一行字符,判断最后一个字符是否为换行符,如果不是就使用getchar()连续读取输入流中的字符,直到读取到换行符为止。
方法五:使用system("pause")
这种方法并不是严格意义上的清空输入缓冲区,而是一种通过暂停程序的方式来清空输入缓冲区的方法:
int main()
{
// your code here
system("pause");
return 0;
}
这个方法的本质是调用Windows系统命令pause来暂停程序的执行,这时候输入缓冲区中的所有字符都会被清空。
注意事项
在使用以上任意一种方法时,要注意输入的数据格式,否则可能会导致不可预知的结果。
总而言之,在使用C语言清空输入缓冲区的时候,要注意不同编译器之间的差异,尽量使用可移植的方法。