【问题标题】:cin >> integer and while loopcin >> 整数和 while 循环
【发布时间】:2015-02-20 07:26:39
【问题描述】:

下面的代码,

如果我输入一个字母或一个很长的数字,while 循环就会出错,这是为什么呢?

void main()
{
    int n{ 0 };

    while (true)
    {
        cout << "Enter a number: ";
        cin >> n;
        cout << n << endl;
    }
}

【问题讨论】:

标签: c++11 while-loop cin


【解决方案1】:

问题是operator&gt;&gt; 期望从输入流中提取一个整数,但那里还有其他东西(用户键入的非整数)。这会在输入流上设置错误状态。在这种状态下,cin &gt;&gt; ... 构造不再阻塞输入,因为流中已经有一些东西(不是整数),所以你会看到你的循环失控了。

需要发生的是,当输入不正确时,必须检测错误状态,必须刷新输入流,并且必须清除错误状态。此时,可能会输入新的(希望是正确的)输入。

示例如下:

#include <iostream>
#include <limits>

using namespace std;

int main () {
  int x = 0;
  while(true) {
    cout << "Enter a number: ";
    if( ! (cin >> x) ) {
      cin.clear();
      cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
      cerr << "Invalid input. Try again.\n";
    }
    else {
      cout << "\t..." << x << "...\n";
    }
  }
  return 0;
}

“非常大的数字”也会导致这种情况的原因是非常大的数字(超过 int 的数字限制的数字)也不是 int,因此,如果您尝试将值读入int,也不会从输入流中读取。它可能看起来像一个整数,但如果它超出了 int 类型的范围,operator&gt;&gt; 将不会尝试将其压缩到 int 变量中。错误状态被设置,循环变得混乱。同样,解决方法是检测错误状态,清除错误标志,清空输入缓冲区,如果需要,再次提示。

【讨论】:

    【解决方案2】:

    嗯,这并不能回答原因,但它确实停止了混乱:system("pause")

    void main()
    {
        int n{ 0 };
    
        while (true)
        {
            cout << "Enter a number: ";
            cin >> n;
            cout << n << endl;
    
            system("pause");
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-11-05
      • 2017-06-21
      • 2016-12-24
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      相关资源
      最近更新 更多