0

我有一些基本上看起来像这样的代码

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 char 输入 'sss' ,最后一个 's' 不会被忽略,并被接受为我在程序中的更多 cin 的输入。

在第一个 cin 发生后,有没有办法计算标准输入(缓冲区?)中的字符数,所以我可以放心地忽略所有这些。

4

3 回答 3

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');
于 2012-09-03T05:02:59.570 回答
2

很不清楚您的意思是什么,但一种含义可能是您想忽略当前行上的所有字符。您无需知道字符数即可:

std::cin.ignore(std::numeric_limits<std::size_type>::max(), '\n');

上面的语句将忽略所有字符,直到它提取一个换行符。

于 2012-09-03T04:56:45.603 回答
0

做一些谷歌搜索我发现了这篇关于如何处理 cin 中无关字符的文章。

显然,直接使用>>on不是一个好习惯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.

代码源

于 2012-09-03T05:17:09.690 回答