为什么while(true)收到无效输入时会跳过cin?

时间:2019-05-25 09:04:38

标签: c++ while-loop

此while循环在收到错误的输入(非整数)后不等待cin的输入。 cin是否会保持虚假状态?

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

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

1 个答案:

答案 0 :(得分:0)

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;
}