std::cin 来自无效输入的无限循环

std::cin infinite loop from invalid input

请阅读以下代码:

#include <iostream>
#include <cstdlib>
int main() {
    std::cout << "Please input one integer." << std::endl;
    int i;
    while (true) {
        std::cin >> i;
        if (std::cin) {
            std::cout << "i = " << i << std::endl;
            break;
        } else {
            std::cout << "Error. Please try again."<< std::endl;
            std::cin.ignore();
            std::cin.clear();
        }
    }
    std::cout << "Thank you very much." << std::endl;
    std::system("pause");
    return 0;
}

当我给std::cin一个无效的输入,比如w,那么Error. Please try again.就会无限输出。 我认为 std::cin.ignore 会使输入流空白,而 std::cin.clear 会将其恢复到正常状态。那么为什么会出现无限循环呢?

默认情况下,std::basic_istream::ignore() 仅忽略 1 个字符:

basic_istream& ignore( std::streamsize count = 1, int_type delim = Traits::eof() );

(来自 http://en.cppreference.com/w/cpp/io/basic_istream/ignore

您的案例的更多惯用用法似乎是此处示例中的用法:

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

另请注意,您要在 ignore() 调用之前调用 clear(),因此 ignore() 的输入提取将成功,而不是立即返回。