0

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

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

2 回答 2

0

说它“清除输入缓冲区”是用词不当。它所做的是前进到下一行 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");

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

于 2021-11-12T09:29:40.330 回答
0

while (strlen(string) > 0 && string[strlen(string) - 1] != '\n');. 所以,fgets当字符串的长度大于 0 时(即,当输入流中有字符等待时)并且当字符串的结尾不等于换行符时。如果输入的结尾等于换行符,则停止。我不确定为什么这段代码不会继续执行并在它出现时吃掉换行符,但它是安全的,因为所有标准读取函数都会忽略初始换行符。@barmar 有一个很好的建议(因为 fgets() 从输入缓冲区读取。如果缓冲区中有数据尚未读取, fgets() 不需要等待用户输入任何内容。)但是他们它们是否忽略尾随换行符(按 ENTER 时生成)不同。fgets保留尾随换行符,但gets将其剥离。

于 2021-11-12T03:03:26.083 回答