我发现这段代码清除了输入缓冲区,但我真的不明白它是如何工作的。任何人都可以用简单的方式解释它吗?
do{
fgets(string,LENGTH,stdin);
} while (strlen(string) > 0 && string[strlen(string) - 1] != '\n');
我发现这段代码清除了输入缓冲区,但我真的不明白它是如何工作的。任何人都可以用简单的方式解释它吗?
do{
fgets(string,LENGTH,stdin);
} while (strlen(string) > 0 && string[strlen(string) - 1] != '\n');
说它“清除输入缓冲区”是用词不当。它所做的是前进到下一行 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");
请注意,在这两种情况下,任何流错误都将保留,以便在下次尝试输入时检测到。
while (strlen(string) > 0 && string[strlen(string) - 1] != '\n');
. 所以,fgets
当字符串的长度大于 0 时(即,当输入流中有字符等待时)并且当字符串的结尾不等于换行符时。如果输入的结尾等于换行符,则停止。我不确定为什么这段代码不会继续执行并在它出现时吃掉换行符,但它是安全的,因为所有标准读取函数都会忽略初始换行符。@barmar 有一个很好的建议(因为 fgets() 从输入缓冲区读取。如果缓冲区中有数据尚未读取, fgets() 不需要等待用户输入任何内容。)但是他们它们是否忽略尾随换行符(按 ENTER 时生成)不同。fgets
保留尾随换行符,但gets
将其剥离。