Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在读取字符后清除cin缓冲区_C++_Linux_Unix_Stream_Istream - Fatal编程技术网

C++ 如何在读取字符后清除cin缓冲区

C++ 如何在读取字符后清除cin缓冲区,c++,linux,unix,stream,istream,C++,Linux,Unix,Stream,Istream,我有一个问题。首先我需要从用户输入中读取一个字符,然后我需要读取整数。问题是,如果我在第一个cin上输入多个字符,它不会请求输入整数值。 下面是我的代码片段。 是否有复位或清除cin缓冲区的功能。 我是新手,如果这个问题很愚蠢,我很抱歉。谢谢 int *i = new int; int *c = new char; std::cin >> *c; std::cin >> *i; 我不知道你为什么在这里创建指针。我也不知道,在尝试为int*分配字符时,您是如何避免编译器错

我有一个问题。首先我需要从用户输入中读取一个字符,然后我需要读取整数。问题是,如果我在第一个cin上输入多个字符,它不会请求输入整数值。 下面是我的代码片段。 是否有复位或清除cin缓冲区的功能。 我是新手,如果这个问题很愚蠢,我很抱歉。谢谢

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

我不知道你为什么在这里创建指针。我也不知道,在尝试为int*分配字符时,您是如何避免编译器错误的。如果需要读入int和char,请执行以下操作:

int i;
char c;

std::cin >> i;
std::cin >> c;
在评论中建议类似Zeta,听起来你可能需要在C++上做一些阅读。希望这有帮助。

你问:

是否有复位或清除cin缓冲区的功能

有。在给定的链接中有一个示例代码,说明了如何使用该函数

在你的情况下,我看到如下情况:

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;
}

这是一个极其简单的问题,似乎没有人知道如何正确处理。最有效的方法是使用输入缓冲区中的确切字符数调用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.
出于以下几个原因,这是最好的答案:

不包括笨重的。 没有巨数处理。 所需的操作更接近输入缓冲区的可用性与数值限制。 以下输入操作中的一致性不会读取超过分隔符的内容,或在缓冲区中保留字符。
由C++语言的律师罗伯特·约翰逊博士推荐。不过,我强烈建议你买本书。至少再过一个月,忘掉新的。谢谢你的编辑,埃里克森先生。论坛新手,不是编码新手,无论如何,再次感谢你。如果它“如预期”工作,这将是非常好的,但由于:在许多std库中实现了avail,它将只返回0,这显然仍然是一个一致的实现。原因是rdbuff是一种访问cin的streambuf*成员的方法,cin是一个istream对象。您尚未在中阅读任何内容,因此在调用时in_avail返回零。