我已经阅读了大约 5-10 条关于如何清除标准输入的不同建议,但没有一条适合我的需要。问题是 fflush(stdin)
在我的电脑上工作得很好,但不幸的是它似乎并不是在任何地方都工作,所以我需要一些具有相同功能的东西。我尝试过的所有其他方法都会在标准输入不为空时清除标准输入,但在标准输入为空时需要用户输入,这意味着它需要在我不想得到任何输入的时刻输入(+它无论如何都会丢弃它)。
问题是:在我需要用户输入之前,我能否以某种方式确保 stdin
为空? (如果没有,那么然后才以某种方式清除它?)
类似于:
if (stdin is NOT empty)
while (getchar() != '\n')
continue;
编辑:问题是我从 stdin
一个一个地加载字符,在某些时候,上一次迭代的输入的一部分可能会也可能不会被丢弃。无论哪种方式,在我要求用户处理另一个输入之前,我都需要清楚 stdin
。清除缓冲区本身并不是什么大问题,问题是当程序到达清除 stdin
点时输入为空时会发生什么,因为在那一刻程序需要另一个输入会被清算功能吃掉。这就是我想要摆脱的。 (当我可以使用 fflush(stdin);
时,我只知道,对于我程序的下一行,无论如何,stdin
都将是空的,没有问题.. .)
最佳答案
How to clear stdin before getting new input?
.. so I need something with the same functionality.
对于可移植的 C,这是不可能的。
相反建议一个不同的(和更常见的 C)范例:
确保之前的输入函数消耗所有之前的输入。
fgets()
(或 *nix getline()
)是典型的方法,可以解决大多数情况。
或者自己动手。以下读取整行,但不保存额外的输入。
int mygetline(char *buf, size_t size) {
assert(size > 0 && size <= INT_MAX);
size_t i = 0;
int ch;
while ((ch = fgetc(stdin)) != EOF) { // Read until EOF ...
if (i + 1 < size) {
buf[i++] = ch;
}
if (ch == '\n') { // ... or end of line
break;
}
}
buf[i] = '\0';
if (i == 0) {
return EOF;
}
return i;
}
关于c - 如何在获得新输入之前清除标准输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36715002/