3

如果您输入了错误的类型,我需要知道如何使我的 cin 语句不会出现“删除”本身。代码在这里:

int mathOperator()
{
  using namespace std;

  int Input;
  do
  {
    cout << "Choose: ";
    el();
    cout << "1) Addition";
    el();
    cout << "2) Subtraction";
    el();
    cout << "3) Multiplication";
    el();
    cout << "4) Division";
    el();
    el();
    cin >> Input;

  }
  while (Input != 1 && Input != 2 && Input!=3 && Input!=4);
  return Input;
}

例如,执行、输入一个字符,它会不停地循环,就好像 cin 语句不存在一样。

4

6 回答 6

5

您必须检查输入是否成功并在不成功时进行处理:

int mathOperator() {
  using namespace std;

  int Input;
  do {
    cout << "Choose: ";
    el();
    cout << "1) Addition";
    el();
    cout << "2) Subtraction";
    el();
    cout << "3) Multiplication";
    el();
    cout << "4) Division";
    el();
    el();
    while (!(cin >> Input)) {  // failed to extract
      if (cin.eof()) {  // testing eof() *after* failure detected
        throw std::runtime_error("unexpected EOF on stdin");
      }
      cin.clear();  // clear stream state
      cin.ignore(INT_MAX, '\n');  // ignore rest of line
      cout << "Input error.  Try again!\n";
    }
  } while (Input != 1 && Input != 2 && Input!=3 && Input!=4);
  return Input;
}

如果您不检查提取是否成功,则 cin 将处于失败状态 (cin.fail())。一旦处于失败状态,稍后的提取将立即返回,而不是尝试从流中读取,从而有效地使它们成为无操作 - 导致您的无限循环。

于 2011-02-01T17:16:58.130 回答
3

除非您非常确定输入的格式正确,否则您很少希望operator>>直接从输入流中使用。

用 阅读一行通常更容易std::getline,将其放入 astd::istringstream中,然后从那里阅读。如果失败,您打印/记录一条错误消息,丢弃该行的其余部分并(可能)继续下一行。

于 2011-02-01T17:16:39.020 回答
2
char Input;

 do
 {
// same code 
 }
 while (Input != '1' && Input != '2' && Input != '3' && Input!='4');
 return Input;

[编辑]

如果你想将 char 转换为 int 你可以使用这段代码

int i = (Input - 48);
于 2011-02-01T17:08:35.707 回答
2

不要阅读int,阅读char所以 cin 将传递任何无效字符

于 2011-02-01T17:09:14.280 回答
2

读取错误值后,cin 处于“失败”状态。你必须重置它。

您必须清除错误标志并清空缓冲区。因此:

   cin.clear(); 
   cin.ignore(std::numeric_limits<streamsize>::max(), '\n');

第二个调用“刷新”可能存在的任何数据的输入缓冲区,以便为下一个“cin”调用做好准备。

如果您发现自己“在您的代码中”编写了这两行代码,您可以编写一个简单的内联函数来替换它。

   inline void reset( std::istream & is )
   {
       is.clear();
       is.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
   }

虽然我已经让这个函数接受任何 istream,但大多数时候它只会用于cin用户输入的地方并输入无效的内容。如果它是无效的文件或字符串流输入,则无法修复它,您最好只抛出异常。

于 2011-02-01T17:11:58.087 回答
0

我同意 char 也很方便,因为您始终可以转换为 int,以回答您关于为什么会发生这种情况的问题,当 cin 输入作为 int 执行但输入 char 时,输入保留在循环期间的输入流,这就是它似乎“消失”的原因。

有关更多信息:请参阅 Narue 的帖子,网址为http://www.daniweb.com/forums/thread11505.html

于 2011-02-01T17:13:21.883 回答