如何在获得新输入之前清除标准输入?

Tom*_*Tom 12 c stdin getchar

我已经阅读了大约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都是空的,没有问题......)

chu*_*ica 5

如何在获取新输入之前清除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)


Sou*_*osh 0

TL;DR 根据标准fflush(stdin)调用未定义的行为,您永远不应该使用它。


来到您的代码(逻辑),您可以查找EOF. 它没有在运行此循环之前stdin应该有一些输入的先决条件。

就像是

 while (getchar() != EOF);   //; is not a mistake
Run Code Online (Sandbox Code Playgroud)

应该可以满足您的需求。

  • 呃没有。您的循环会等待,直到用户生成 EOF(`^D` 或 `^Z`),而 OP 则要求一种刷新输入缓冲区的方法。 (2认同)