【问题标题】:How to clear cin buffer after reading char读取char后如何清除cin缓冲区
【发布时间】:2014-12-02 18:52:35
【问题描述】:

我有一个问题。首先我需要从用户输入中读取一个字符,然后我需要读取整数。问题是如果我在第一个 cin 上输入多个字符,它不会要求输入整数值。
这是我的代码的 sn-p。
是否有任何功能可以重置或清除 cin 的缓冲区。
我是新手,如果问题很愚蠢,对不起。谢谢。

int *i = new int;
int *c = new char;
std::cin >> *c;
std::cin >> *i;

【问题讨论】:

  • 新手没问题。不过,我强烈建议你买一本书。忘记new,至少再过一个月。

标签: c++ linux unix stream istream


【解决方案1】:

这似乎是没有人知道如何正确解决的极其简单的问题之一。执行此操作的最有效和最高效的方法是使用输入缓冲区中的确切字符数调用 ignore。

cin.clear();                              //clear errors/bad flags on cin

cin.ignore(cin.rdbuf()->in_avail(), '\n');//precise amount of ignoring
cin.rdbuf()->in_avail() //returns the exact number of characters in the cin buffer.

这是最好的答案有几个原因:

没有笨重的包括。 没有巨数处理。 靠近输入缓冲区的所需操作(in_availnumeric_limits)。 以下输入操作的一致性(不会读取超出“分隔符 (\n)”,或将字符留在缓冲区中)。 由 c++ 语言律师 Robert Johnson 博士推荐。

【讨论】:

  • 感谢 Erickson 先生的编辑。论坛新手,编码新手,无论如何再次感谢您。
  • 如果它“按预期”工作,这将是非常简洁的,但是因为:in_avail 在许多标准库中实现,它只会返回0,这显然仍然是一个符合要求的实现。
  • 原因是因为rdbuff()是访问cin的streambuf*成员的方法,cin是一个istream对象。您还没有阅读任何内容,因此 in_avail() 在您调用它时返回零。
【解决方案2】:

你问:

是否有任何功能可以重置或清除cin的缓冲区。

std::istream::ignore()。给定链接中有示例代码,显示了如何使用该函数。

在你的情况下,我看到类似:

int i;
int c;
std::cin >> c;
std::cin >> i;

if (std::cin.bad()) {
   std::cin.clear(); // unset failbit
   std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // skip bad input
   std::cin >> i;
}

【讨论】:

    【解决方案3】:

    我不确定你为什么要在这里创建指针。我也不知道您如何在尝试为int* 分配char 时不会遇到编译器错误。如果您需要读取 int 和 char,请执行以下操作:

    int i;
    char c;
    
    std::cin >> i;
    std::cin >> c;
    

    就像 Zeta 在 cmets 中推荐的那样,听起来您可能需要对 C++ 做一点阅读。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      相关资源
      最近更新 更多