在执行cin之后,对标准输入中的字符数进行计数

Counting the number of characters in standard input after a cin has been executed

本文关键字:字符 标准输入 cin 执行 之后      更新时间:2023-10-16

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

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发生后计算标准输入(缓冲区?)中的字符数,这样我就可以安全地忽略所有字符。

这是如何工作的?它应该忽略输入缓冲区中的所有可用内容,以防止以后消耗第三个s。它使用CCD_ 2。

std::cin.ignore(std::cin.rdbuf()->in_avail());

如果这不起作用,你可以试着忽略,直到你到达换行符。

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

您的意思还不清楚,但一个意思可能是您想要忽略当前行上的所有字符。你不需要知道字符的数量就可以做到这一点:

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

上面的语句将忽略所有字符,直到提取出换行符为止。

通过谷歌搜索,我发现了这篇关于如何处理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

由于我们每次使用std::getline()读取到n,因此还从std::cin中提取外来字符并将其放入line中。

代码源