【问题标题】:While keeps repeating on letters but not on #'s虽然在字母上不断重复,但在 # 上却没有
【发布时间】:2011-12-03 17:44:30
【问题描述】:

我在这里有一个 while 循环,它只接受 1 和 2 作为数字,如果我插入和数字不是这些,我的 else 语句将继续要求正确的一个,它可以正常工作。但是,如果我插入一个字母,我的 else 语句将永远循环。我怎样才能解决这个问题?

#include <iostream>
using namespace std;

int main()
{
int myChoice;
cin >> myChoice;

while ( myChoice >= 2 ||  myChoice <= 1)
{
    if (myChoice == 1)
    {
        cout <<"food1";
        break;
    }
    else if (myChoice == 2)
    {
        cout <<"food2";
        break;
    }
    else
    {
        cout << " " << endl;
        cout << "Please select the proper choices" << endl;
        cout << "Try again: ";
        cin >> myChoice;
    }
}
return 0;
}

【问题讨论】:

  • 您的while 条件始终为真。
  • 我的 while 条件搞砸了?
  • 嗯,这总是正确的,因为myChoice 总是大于或等于2 或小于或等于1,所以使用while(true) 会做同样的事情。你可以改变一些事情以使其更简单。看我的回答。

标签: c++ while-loop if-statement


【解决方案1】:

如果输入非数字,则cin &gt;&gt; myChoice 失败。这意味着它将输入完整地保留在输入缓冲区中,当您再次到达那里时,它会尝试解析它并失败,依此类推……您必须清除错误状态并忽略非数字。最简单的方法是这样的:

cout << "Try again: ";
cin.clear(); // clear error state
cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); // ignore till the end of line
cin >> myChoice;

【讨论】:

  • 下面的人正在谈论清除缓冲区。我想这更合理,因为我们甚至不接受它。但是我们如何清除缓冲区呢?
  • @mystycs:你不能真正以跨平台的方式清除缓冲区,因为它是一个流,因此从它读取的任何内容都会重新填充缓冲区。如上所示,您可以忽略缓冲区中的所有内容,直到行尾。
  • 啊,所以这是我认为的标准做法?
  • 但是我的代码除了字母之外的处理正确吗?
  • @mystycs:是的。同样理论上你应该区分失败的输入(cin.fail()),成功的输入但不正确的值,和EOF(cin.eof())。
【解决方案2】:

这里的问题是 cin >> 运算符期望接收int 输入并接收char 输入。

istream 模块(其中 cin 是一个实例)正在使用缓冲 I/O。这意味着用户输入首先存储在缓冲区中,然后在用户程序访问 >> 运算符时从该缓冲区中读取。通常,如果 >> 运算符成功读取和解析用户输入,则从缓冲区中提取读取的数据,并且 >> 运算符的下一次调用将在最后一次调用停止的地方继续。但是,在您的情况下, >> 运算符尝试将用户输入解析为数字并失败,因为它包含不是数字的非法字符。在这种情况下,>> 运算符不会从缓冲区中提取读取的数据,并且在以下对 >> 运算符的调用中会一遍又一遍地引用相同的数据。

您应该在失败时清空缓冲区,例如 ybungalobill 建议的方式。

【讨论】:

  • 好的,我明白了,你打算如何清空缓冲区?
  • 我是否应该通过将其设置回 0 来清除该值?所以 int myChoice = 0;在最后?
  • ybungalobill 让路:cin.clear()isteam 对象中删除错误标志,cin.ignore() 从缓冲区中删除数据,或者“忽略”它,而不是...跨度>
【解决方案3】:

您的while 条件始终为true,然后您使用break 退出循环。你可以像这样简化一些事情:

#include <iostream>
using namespace std;

int main()
{
  int myChoice;
  cin >> myChoice;

  while( myChoice != 1 || myChoice != 2 ) {
    cout << endl;
    cout << "Please select the proper choices" << endl;
    cout << "Try again: ";
    cin.clear();
    cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
    cin >> myChoice;
  }

  // At this point myChoice is 1 or 2

  if (myChoice == 1)
    cout << "food1";
  else if (myChoice == 2)
      cout << "food2";
}

【讨论】:

  • 啊我看到 myChoice != 1 && myChoice != 2 但实际上是 myChoice != 1 || myChoice != 2 最终改为工作。不是和。
猜你喜欢
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 2018-12-07
  • 2017-04-27
相关资源
最近更新 更多