我已经阅读了大约5-10个不同的建议如何清除标准输入,但它们都不适合我的需要.事情就是fflush(stdin)在我的计算机上完美运行,但不幸的是它似乎无处不在,所以我需要具有相同功能的东西.我想尽其他办法清除标准输入时,它不是空的,但需要用户输入时标准输入是空的,这意味着它需要在一个时刻,我不想得到任何输入(+后将其丢弃也无妨).
问题是:stdin在我需要用户输入之前,我可以以某种方式确定IS是空的吗?(如果不是,那么,然后才以某种方式清除它?)类似于:
if (stdin is NOT empty)
while (getchar() != '\n')
continue;
Run Code Online (Sandbox Code Playgroud)
编辑:问题是我stdin逐个加载字符,在某些时候,上一次迭代的输入的一部分可能会或可能不会被丢弃.无论哪种方式,stdin在我要求用户处理另一个输入之前我需要清楚.清除缓冲区本身是没有这样一个大问题,问题是当输入为空当程序到达空地的点会发生什么stdin,因为在那一刻程序需要另一个输入这是会被清除功能被吃掉.这就是我想要摆脱的东西.(当我可以使用时,fflush(stdin);我才知道,对于我的程序的下一行,stdin无论如何,WILL都是空的,没有问题......)
如何在获取新输入之前清除stdin?
..所以我需要一些具有相同功能的东西。
对于便携式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;
}
Run Code Online (Sandbox Code Playgroud)
TL;DR 根据标准fflush(stdin)调用未定义的行为,您永远不应该使用它。
来到您的代码(逻辑),您可以查找EOF. 它没有在运行此循环之前stdin应该有一些输入的先决条件。
就像是
while (getchar() != EOF); //; is not a mistake
Run Code Online (Sandbox Code Playgroud)
应该可以满足您的需求。
| 归档时间: |
|
| 查看次数: |
16752 次 |
| 最近记录: |