cin>>整数和while循环

时间:2015-02-20 07:26:40

标签: c++11 while-loop cin

使用以下代码,

如果我输入一个字母或一个很长的数字,while循环会变得混乱,为什么会这样?

void main()
{
    int n{ 0 };

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

2 个答案:

答案 0 :(得分:4)

问题是operator>>期望从输入流中抽取一个整数,但还有其他东西(用户键入的非整数)。这会在输入流上设置错误状态。在这种状态下,cin >> ...构造不再阻塞输入,因为流中已经存在某种东西(不是整数),所以你看到你的循环变得混乱。

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

见下面的例子:

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

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

答案 1 :(得分:-1)

嗯,这并没有回答原因,但确实会阻止乱七八糟的系统(&#34;暂停&#34;)

void main()
{
    int n{ 0 };

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

        system("pause");
    }

}