使用C语言怎样清空输入缓冲区?这里有多种方法值得借鉴

方法一:使用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语言清空输入缓冲区的时候,要注意不同编译器之间的差异,尽量使用可移植的方法。

后端开发标签