首页 > 解决方案 > 当接收到无效输入时,为什么while(true)会跳过cin?

问题描述

在接收到错误输入(非整数)后,此 while 循环不会等待来自 cin 的输入。cin 是否以某种方式保持虚假状态?

while (true) {
    int x {0};
    cout << "> ";
    cin >> x;
    cout << "= " << x << endl;
}

我希望这个while循环每次都等待输入,但是当它接收到错误的输入时不再发生这种情况。

标签: c++while-loop

解决方案


一旦cin失败,它将保持无效状态,直到被清除。

不带参数的clear()可用于在意外输入后取消设置故障位

通过为它们分配状态值来设置流错误状态标志。默认情况下,分配 std::ios_base::goodbit 具有清除所有错误状态标志的效果。

正如@Peter指出的那样,您还必须清除缓冲区。

你的例子是这样的:

while (true) {
  int x{0};
  cout << "> ";
  if (!cin) {
    // unset failbit
    cin.clear();
    // clear the buffer
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
  }
  cin >> x;
  cout << "= " << x << endl;
}

推荐阅读