如何在读取char后清除cin缓冲区

时间:2014-12-02 18:52:35

标签: c++ linux unix stream istream

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

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

3 个答案:

答案 0 :(得分:0)

你问:

  

是否有任何重置或清除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;
}

答案 1 :(得分:0)

这是一个非常简单的问题,似乎没有人知道如何正确地做。最有效和最有效的方法是使用输入缓冲区中的确切字符数调用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)。 以下输入操作的一致性(不会读取&#34;分隔符(\n)&#34;或将字符留在缓冲区中)。 由c ++语言律师Robert Johnson博士推荐。

答案 2 :(得分:-1)

我不确定你为什么在这里创建指针。我也不知道你是如何因尝试为char分配int*而导致编译错误的。如果需要读入int和char,请执行以下操作:

int i;
char c;

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

与评论中推荐的Zeta一样,听起来您可能需要对C ++进行一些阅读。希望这会有所帮助。