为什么我会得到无限循环?

时间:2013-09-20 09:44:20

标签: c++ cin

int main()
{
  unsigned short wC;

  while(1)
  {
    cout << "Enter the Value"<<endl;
    cin >> wC;
    if(wC < 0 || wC > 3)
    {
      cout << "Wrong value, Please Enter again" << endl;
    }
    else break;
  }// end of while

  cout << "The value is : " << wC << endl;
}//end of main

在上面的代码中,当我在短0xffff范围内给出值时,它可以正常工作。 并且只有当用户在0到3之间给出wC的值时才会出现循环并打印该值,否则再次向Enter提示消息并等待用户的输入。

但如果为wC输入的值超过0xffff,则会转到无限循环。

我认为这是由于值仍存在于输入cin缓冲区或什么? 请帮助并提供一些解决方案(提示),以便它可以工作。

注意:用户可以自由提供任何整数值。代码必须将其过滤掉。 在g++ ...和Ubuntu/Linux

上使用sizeof(unsigned short int) = 2 bytes编译器

1 个答案:

答案 0 :(得分:2)

如果输入失败,或者因为您输入的内容根本不是整数,或者因为它溢出或下溢目标类型,cin将进入错误状态(cin.good()返回false)并且进一步的读操作是无操作。将调用cin.ignore(清除剩余输入)和cin.clear(重置错误标志)调入循环。

即使这样,如果用户输入EOF(在Unix上为Ctrl + D,在Windows上为Ctrl + Z),您仍会遇到问题。你需要你的循环来理解那个部分并且突破。

#include <iostream>
#include <limits>
using namespace std;
int main() {
  unsigned short value;
  cout << "Enter the value (0-3):" << endl;
  while(true) {
    cin >> value;
    if (!cin || value < 0 || value > 3) {
      if (cin.eof()) {
        cout << "End of input, terminating." << endl;
        return 0;
      }
      cout << "Bad input, try again (0-3):" << endl;
      cin.clear();
      cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
  }
  cout << "The value is: " << value << endl;
}

当然,输入一个数字就是很多代码中的一个。你可以通过尝试编写一个处理这些东西的函数来练习提供良好的界面。