我正在编写一些代码并使用fgets来获取用户输入 . 然后我在我的代码上写了一个循环,一直要求用户输入,直到用户打印退出 . 但它第二次问,它写了“请输入你的输入”2次而不是1次,并没有等到我第一次输入 . 所以,我用谷歌搜索它,发现stdin缓冲区已经填满,必须清除它 . 我找到了这个解决方案
void dump_line(FILE * fp) {
int ch;
while ((ch = fgetc(fp)) != EOF && ch != '\n') {
/* null body */;
}
}
然后从main函数调用:
dump_line(stdin);
我很难理解它 . 据我了解,它只是赋予“ch”fgetc(stdin)的值 . 我只是无法理解如何将fgetc(stdin)分配给“ch”清除缓冲区 . 非常感谢您的帮助!
6 回答
这是我用于用户输入的旧片段,如果我真的需要在纯C中执行它:
它从stdin检索
bsize
个字母并将它们存储到给定的缓冲区中 . stdin输入缓冲区中剩余的东西将被自动清理 . 它还从输入数据中删除换行符(\ r和\ n) .函数返回成功读取的字符数 .
调用
fgetc
具有 side effect ,该字符从该文件流中读取 and removed .将
fgetc(stdin)
分配给ch
不是清除缓冲区的原因 . 这是fgetc(stdin)
的实际召唤 . 每次调用(因此,循环的每次迭代)都会从stdin
中获取一个char .这个怎么运作:
调用
fgetc(stdin)
,并将结果分配给ch
.如果
ch
不等于EOF
或'\n'
,请转到1 .当循环停止时,两件事之一将成立:你现在在下一行重新开始,或者
stdin
是空的,你将不再获得任何输入 . (后者在交互式应用程序中是不常见的,但是当人们从其他地方将内容传输到您的应用程序时很常见 . 为此做好准备 . )fgetc()
从缓冲区中获取一个字符 . 此代码从缓冲区中读取字符,直到到达文件结尾或换行符 .这是相同的循环,但写的不同,也许这将解释它:
清除缓冲区的另一个例子: