c - 如何在 C 中检查输入缓冲区/流中的任何内容?

标签 c input stream buffer flush

我为此搜索了很多解决方案,但没有一个能满足我的需求。

我需要:

  1. 使用 scanf() 读取两个由空格分隔的整数。
  2. 如果只输入了一个整数,我需要检查并清除缓冲区。
  3. 如果输入的整数超过 2 个,我需要检查并清除缓冲区。

到目前为止,我一直使用getchar()来实现检查和清除。问题是如果缓冲区中没有任何内容,getchar() 会等待一个字符。

我如何检查输入缓冲区/流中是否没有任何内容? 这样,如果没有任何内容,我就不必使用 getchar() 清除缓冲区

最佳答案

您不能使用标准 C 来执行此操作 - 检查 stdin 缓冲区中的字符,如果不存在则立即返回。

但我认为无论如何这里都不需要。只需使用 fgets() 读取一行,等待用户键入 0 个或更多字符,然后 Enter 将放置一个 '\n'stdin 中。 fgets() 将返回。

使用 "%n" 记录当时扫描的位置并确保正确的空格分隔符并检测额外的垃圾。

char buf[100];
if (fgets(buf, sizeof buf, stdin) == NULL) Handle_EOF();
buf[strcspn(buf, "\n")] = '\0'; // lop off potential \n

int n1, n2;
int cnt = sscanf(buf, "%d%n%d%n", &d1, &n1, &d2, &n2);

if (buf[0] == '\0') Handle_NothingWasEntered();
else if (cnt == 1 && buf[n1] == '\0') Handle_OneWasEntered(d1);
else if (cnt == 2 && buf[n1] == ' ' && buf[n2] == '\0') Handle_TwoWereEntered(d1, d2);
else Handle_BadInput(buf);
}

关于c - 如何在 C 中检查输入缓冲区/流中的任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32923054/

相关文章:

c - C 中的小泛型编程问题

c++ - 如何在 C++ 中正确读取和覆盖同一个文件

html - Chrome 输入类型 ="number"CSS 样式

javascript - 达到 maxlength 后如何限制输入的字符?

java - 如果不关闭流,为什么文件不会被填充?

java - 使用 JNI 通过 std::ostream 从 C++ 获取文本数据到 Java

swift - 如何快速直播地点?例如 uber、lyft 等

c++ - C/C++ 中的简单广播库/示例

c - 使用 DMA 生成 STM32F3 DAC 信号

c - 提供以下程序的 4 种可能结果