首页 > 解决方案 > 这如何清除输入缓冲区?

问题描述

我发现这段代码清除了输入缓冲区,但我真的不明白它是如何工作的。任何人都可以用简单的方式解释它吗?

do{
    fgets(string,LENGTH,stdin);
} while (strlen(string) > 0 && string[strlen(string) - 1] != '\n');

标签: cfgetsinput-buffer

解决方案


说它“清除输入缓冲区”是用词不当。它所做的是前进到下一行 input

代码是一个do/while循环。它假定一个名为的 char 数组string至少LENGTH在大小上。

循环的主体尽可能多地读取一行,最多LENGTH - 1字符:

fgets(string,LENGTH,stdin);

from 的返回值fgets()被忽略 - 这是一个错误,因为它可能意味着string在失败情况下(例如 EOF)没有分配给它,我们可以永远循环。

循环条件检查我们是否已经读到了行尾。fgets()有一个测试,字符串至少有一个字符(如果成功的话,它将),然后将最后一个字符与换行符进行比较:

while (strlen(string) > 0 && string[strlen(string) - 1] != '\n')

如果我们看到一个换行符,那么fgets()已经阅读了该行的其余部分;如果没有,它会LENGTH-1从较长的输入行读取字符,并且仍有输入要消耗,所以继续循环。


固定版本:

while (fgets(string, LENGTH, stdin) && string[strlen(string) - 1] != '\n')
    ;

更简单的选择:

scanf("%*[^\n]%*c");

请注意,在这两种情况下,任何流错误都将保留,以便在下次尝试输入时检测到。


推荐阅读