【问题标题】:Why does while (true) skip cin when it received invalid input? [duplicate]当接收到无效输入时,为什么while(true)会跳过cin? [复制]
【发布时间】:2026-01-17 19:55:01
【问题描述】:

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

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

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

【问题讨论】:

标签: c++ while-loop


【解决方案1】:

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

【讨论】:

  • 这实际上还不够,因为有问题的非整数输入将保留在 cins 缓冲区中,这将导致 cin &gt;&gt; x 立即失败,并且循环继续但仍然卡在上面输入。
最近更新 更多