1
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它工作正常。并且只有当用户wC在 0 到 3 之间给出值时才会退出循环并打印该值,否则会提示消息再次输入并等待用户输入。

但是,如果输入的值wC大于0xffff则进入无限循环。

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

注意:用户可以自由给出任何整数值。代码必须将其过滤掉。在... 和上使用g++编译器Ubuntu/Linuxsizeof(unsigned short int) = 2 bytes

4

1 回答 1

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

当然,仅输入一个数字就需要大量代码。您可以通过尝试编写一个为您处理这些东西的函数来练习提出好的接口。

于 2013-09-20T09:49:52.227 回答