为什么在输入错误后不能通过设置std :: cin.clear()来使用std :: cin?

时间:2018-09-15 16:57:25

标签: c++

我从https://en.cppreference.com/w/cpp/io/basic_ios/clear阅读了示例代码并尝试了此操作:

命令行输入为:w

#include <iostream>
#include <string>

int main()
{
    double n = 5.0;
    std::cin >> n;
    std::cout << std::cin.bad() << "|" << std::cin.fail() << "\n";
    std::cout << "hello" << "\n";
    std::cin.clear();
    std::cout << std::cin.bad() << "|" << std::cin.fail() << "\n";
    std::cin >> n;   //Why can't I input again here?
    std::cout << "world" << "\n";
    std::cout << n << "\n";
}

我不明白为什么在不让我再次输入的情况下程序会完成,我想我已经使用std::cin.clear()来重置所有“失败”状态。

1 个答案:

答案 0 :(得分:4)

clear只是重置错误标志,但是它将导致失败的先前输入保留在缓冲区中。因此,第二个cin >> n将再次读取相同的输入,并且将再次失败。因此,您将没有机会输入新的输入内容。

您需要从缓冲区中提取错误的字符(除了调用cin.clear()之外);例如,使用cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'),它将忽略每个字符,直到\n首次出现。您也可以使用fgets,但是-与ignore相比,-fgets需要一个缓冲区来存储您实际上不感兴趣的字符。