我有一些基本上看起来像这样的代码
int a;
cin>>a;
if(!cin.good())
{
std::cin.clear();
std::cin.ignore(2);
// set some default value for 'a' and display some messages
}
如果我给出一个整数(如预期的那样)或者如果我试图稍微弄乱它并且最多给2个字符,这可以正常工作。例如。 “ss”,但是如果我给出一个3字符输入'sss',那么最后的's'不会被忽略,并被接受作为我在我的程序中有更多cin的输入。
有没有办法计算第一个cin发生后标准输入(缓冲区?)中的字符数,所以我可以安全地忽略所有这些字符。
答案 0 :(得分:3)
这是如何工作的?它应该忽略输入缓冲区中的所有可用内容,防止稍后消耗第三个s
。它使用std::basic_streambuf::in_avail
。
std::cin.ignore(std::cin.rdbuf()->in_avail());
如果无效,您可以尝试忽略,直到换行。
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
答案 1 :(得分:2)
目前还不清楚你的意思,但一个意思是你想要忽略当前行上的所有字符。您无需知道要执行此操作的字符数:
std::cin.ignore(std::numeric_limits<std::size_type>::max(), '\n');
上述语句将忽略所有字符,直到它提取换行符。
答案 2 :(得分:0)
做一些谷歌搜索我在how to cope with extraneous characters in cin找到了这篇文章。
显然,直接在>>
使用std::cin
不是一个好习惯。像这样使用它,
int a;
std::string line;
std::getline( cin, line );
std::stringstream ss( line );
if ( ss >> a )
// Success
// Failure: input does not contain a valid number
由于我们每次使用\n
阅读std::getline()
,因此也会从std::cin
中提取无关字符并将其放入line
。