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

  • 本文关键字:cin std clear 设置 不能 错误 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()重置了所有"失败"状态。

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

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

最新更新