c++ - cin 缓冲区没有被忽略?

标签 c++ cin

while(cout << "Enter a positive integer: " &&
        (!(cin >> anInteger) || anInteger < 0))
{
    cout << "Enter a positive integer.\n";
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

while(cout << "Read or write (r/w): " &&
        (!(cin >> rw) || (rw != 'r' && rw != 'w')))
{
    cout << "Enter r or w.\n";
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

这里我要求输入一个整数,后跟“r”或“w”。但是,当在第一个 while 语句中输入类似“4r”的内容时,“r”保留在缓冲区中并应用于下一个 while 语句。我该如何解决这个问题?

只有在第一个 while 循环中输入的是所有整数而不是截断字符时,最简单的方法是什么?

最佳答案

您可以只ignore() 整数后一行的内容:当读取整数时,读取在第一个不适合整数的字符处停止,即不会读取以下换行符.

考虑到您在多个地方忽略字符直到行尾,创建并使用操纵器来执行此操作可能是合理的:

std::istream& igln(std::istream& in) {
    return in.ignore(std::numeric_limits<std::streamsize>::max());
}
...
while (std::cout << "Read or write (r/w): "
    && (!(std::cin>> igln >> rw) || (rw != 'r' && rw != 'w')) {
    std::cout << "Enter r or w!\n";
    if (std::cin.eof()) {
        throw std::runtime_error("reached end of stream\n");
    }
    std::cin.clear();
}

请注意,循环总是忽略该行的其余部分,因此在循环内不需要它。

关于c++ - cin 缓冲区没有被忽略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40025687/

相关文章:

c++ - 在 Qt 中获取父布局

C++14 转换为成员函数的返回类型 - 简洁版本

c++ - 为什么 cin.clear() 会修复由 cin 错误输入引起的无限循环?

c++ - 使用 cin.eof()

c++ - 如何在不按 ENTER 且不使用 getch() 或 getche() 的情况下读取 C++ 中的字符?

c++ - 从 Vector3f 转换为 Matrix4f

c++ - 如何在计算中处理 "unsigned long long int"?

c++ - 函数未在范围内声明 (C++)

c++ - 为什么 cin 工作而 cin.getline 不工作?

c++ - cin 抛出错误信息