C++:如何从cin中删除错误的输入?

aja*_*jay 3 c++ iostream

我做了一些cin操作,在使用之前我cin想清除它的状态并冲洗它.我该怎么做?我知道cin.clear()清除错误状态但是要刷新cin 缓冲区如何检查它是否为空,如果不是,我将使用哪个以下语句清空它以便以后可以安全使用cin

cin.ignore(std::numeric_limits<std::streamsize>::max()); 
Run Code Online (Sandbox Code Playgroud)

要么

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
Run Code Online (Sandbox Code Playgroud)

Die*_*ühl 5

看来,你发现了一个问题并想要摆脱错误的输入,例如输入的行.您可以尝试去掉std::cin缓冲区中的内容但通常情况下,这不能很好地工作,因为无法保证流已读取,例如,完整的行.此外,为了使它可能有用,你需要确保stdinstd::cin不同步,否则std::cin永远不会缓冲任何字符:

std::ios_base::sync_with_stdio(false);
// read data using std::cin

if (!std::cin) {
    // clean-up
    std::cin.clear();
    if (std::cin) {
        std::cin.ignore(std::cin.rdbuf()->in_avail()); // ignore what is buffered
    }
}
Run Code Online (Sandbox Code Playgroud)

是否in_avail()返回非零值完全取决于使用的流缓冲区,并且它可能忽略了比您实际想要忽略的更多.例如,如果std::cin替换了流缓冲区以使用它的流缓冲区,std::istringstream它可能会消耗此源中的所有字符.

可能最明智的清理是ignore()下一个字符或当前行上的字符,使用其中任何一个

std::cin.ignore();
Run Code Online (Sandbox Code Playgroud)

要么

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Run Code Online (Sandbox Code Playgroud)

max()std::streamsize被用作一个神奇的数字来表示的计数不应该被视为一个终止条件.如果您没有传递终止字符,则流将忽略字符,直到流的末尾可能不是您想要的.

  • @ajay:当然:`ignore()`的终止条件是:1.它读取了第一个参数指定的字符数(默认为1); 2.终止字符被输入(默认为`std :: char_traits <char> :: eof()`,表示不应该匹配任何字符); 3.到达流的末尾.指定`std :: numeric_limits <std :: streamsize> :: max()`使得计数无限并且不指定终止字符会导致流永远不会因为某个字符而停止,即它只会在整个流之后停止消耗. (2认同)