虽然不断重复字母而不是字母

时间:2011-10-08 21:45:41

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

我在这里有一个while循环,只接受1和2作为数字,如果我插入和不是这些我的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;
}

3 个答案:

答案 0 :(得分:5)

如果输入非数字,则cin >> 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;

答案 1 :(得分:3)

这里的问题是cin&gt;&gt;运营商希望收到int输入并收到char输入。

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

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

答案 2 :(得分:2)

您的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";
}