【问题标题】:How do I check for nothing in the input buffer/stream in C?如何在 C 中检查输入缓冲区/流中的任何内容?
【发布时间】:2015-12-31 14:26:23
【问题描述】:

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

我需要:

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

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

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

【问题讨论】:

  • 您可以检查行尾字符。如果对getchar(); 的最后一次调用返回'\n',那么您已经到达了行尾。
  • @CoolGuy 我已经想到了。它不适用于我的目的。我需要一种不同的方式来检查。
  • 应该的。显示您的代码以及一些示例输入和输出。我认为没有其他方法可以做到这一点。

标签: c input stream buffer flush


【解决方案1】:

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

但我认为无论如何这里都不需要这样做。只需使用fgets() 读取一行,等待用户输入 0 个或更多字符,然后 Enter 将在stdin 中输入一个'\n'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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多