Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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++_Cin - Fatal编程技术网

C++ 计算cin执行后标准输入中的字符数

C++ 计算cin执行后标准输入中的字符数,c++,cin,C++,Cin,我有一些代码基本上是这样的 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

我有一些代码基本上是这样的

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

不清楚您的意思,但有一种意思可能是您希望忽略当前行中的所有字符。这样做不需要知道字符数:

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

上述语句将忽略所有字符,直到提取换行符。

不清楚您的意思,但有一种意思可能是您希望忽略当前行上的所有字符。这样做不需要知道字符数:

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

在提取换行符之前,上述语句将忽略所有字符。

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

如果这不起作用,您可以尝试忽略,直到达到换行

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

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

如果这不起作用,您可以尝试忽略,直到达到换行

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

我在谷歌上找到了这篇文章

显然,直接在
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
中提取无关字符并放入
行中


我在谷歌上找到了这篇文章

显然,直接在
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
中提取无关字符并放入
行中


在第一次提取后尝试
cin.gcount()
gcount()
仅为未格式化的输入函数设置。在第一次提取后尝试
cin.gcount()
gcount()
仅为未格式化的输入函数设置。
std::streambuf::in\u avail()
除了回答以下问题外,不会提供任何有趣的信息:至少可以在不阻塞的情况下提取哪些字符。例如,对于很长的输入,它可能给出部分行的信息,即装入
std::cin
内部缓冲区的字符数。第二种方法是要走的路。
std::streambuf::in_avail()
除了回答以下问题之外,不会给您提供任何有趣的信息:至少可以在不阻塞的情况下提取哪些字符。例如,对于很长的输入,它可能给出部分行的信息,即装入
std::cin
内部缓冲区的字符数。第二种方法是要走的路。