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

标签 c stdin getchar

我已经阅读了大约 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/

相关文章:

c - 使用 scanf 时 getchar 不会停止

c - 为什么 C 中的 getchar() 函数是一个整数?

c++ - CreateProcess( ) 不创建带有 CREATE_NEW_CONSOLE 标志的新窗口 - C/C++

更改 C 结构中矩阵的内容

c - 用C实现二叉搜索树的删除函数

Python 在 Linux 上查找标准输入文件路径

c - 共享内存段的键为0

c - 如果指向标准输入,是什么让 fgets() 实际上等待用户输入?

c - Stdin + 字典文本替换工具 -- 调试

c - getchar函数清除while-condition之外的输入缓冲区?