C++ 而不是在';s

C++ 而不是在';s,c++,while-loop,if-statement,C++,While Loop,If Statement,我在这里有一个while循环,它只接受1和2作为数字,如果我插入的数字不是这些,我的else语句将继续要求正确的数字,这是正确的。但如果我插入一封信,我的else语句将永远循环。我怎样才能解决这个问题 #include <iostream> using namespace std; int main() { int myChoice; cin >> myChoice; while ( myChoice >= 2 || myChoice <= 1) {

我在这里有一个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;
}
#包括
使用名称空间std;
int main()
{
int-myChoice;
cin>>我的选择;

而(myChoice>=2 | | myChoice如果您输入一个非数字,则
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;
#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";
}
cout>myChoice;

这里的问题是,cin>>操作员希望接收
int
输入,并接收
char
输入

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


例如,您应该按照ybungalobill建议的方法,在出现故障时清空缓冲区。

您的
条件始终为
true
,然后您可以使用
中断退出循环。您可以将事情简化如下:

cout << "Try again: ";
cin.clear(); // clear error state
cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); // ignore till the end of line
cin >> myChoice;
#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";
}
#包括
使用名称空间std;
int main()
{
int-myChoice;
cin>>我的选择;
而(myChoice!=1 | | myChoice!=2){

好吧,我明白了,你怎么清空缓冲区?我是否应该通过将其设置回0来基本上擦除该值?因此int myChoice=0;否则在最后?ybungalobill给出了答案:
cin.clear()
isteam
对象中删除错误标志,以及
cin.ignore()
从缓冲区中删除数据,或“忽略”更确切地说,下面的人说的是清除缓冲区。我想这更合理,因为我们甚至不需要它。但是我们如何清除缓冲区呢?@mystycs:你不能真正以跨平台的方式清除缓冲区,因为它是一个流,因此从它读取的任何内容都会重新填充缓冲区。你可以忽略缓冲区中的所有内容直到行尾,如我上面所示。啊,那么这是我假设的标准方法吗?但是我的代码处理正确,而不是字母正确吗?@mystycs:是的。理论上你应该区分失败的输入(cin.fail()),成功的输入但值不正确,以及EOF(cin.EOF())。您的
while
条件始终为真。我把while条件弄糟了?嗯,它始终为真,因为
myChoice
将始终大于或等于
2
或小于或等于
1
,所以使用
while(真)
也会做同样的事情。你可以改变一下,让事情变得更简单。看我的答案。啊,我看到了myChoice!=1&&myChoice!=2,但实际上myChoice!=1 | | myChoice!=2最终起了作用。不是和。