while循环 - 第一次输入后没有任何反应

时间:2013-05-20 07:31:17

标签: c++ while-loop

int option;
int invalidOption2 = 0;

while(invalidOption2 == 0){
      try{
        cin>>option;
        if(!cin){
            error("invalid input");
        }
        if(option<1 || option>2){
            error("invalid input");
        }
        if(option==1) {
            invalidOption2 = 1;
            cout<<"option 1 was selected"<<endl;
        }
        else if(option==2) {
            invalidOption2 = 1;
                        cout<<"option 2 was selected"<<endl;
        }       
      }
      catch(runtime_error& e) { 
              cerr <<"Please enter a valid option" << endl;
      }
}

使用上面的代码时,对于我输入的第一个值,它将继续移动到下一行并等待另一个输入,而不是显示选项消息或错误消息。但是,当我输入第二个值时,它正常工作。

例如,如果我输入

a(这里没有任何反应,所以我需要输入另一个值)

1

“您选择了选项1”

将显示

,并且原始无效输入没有错误消息。

我想知道如何获得下面的结果。

“请选择有效的选项”

1

“您选择了选项1”

任何帮助将不胜感激

4 个答案:

答案 0 :(得分:1)

除非有{。},否则您无法访问"Please enter a valid option" 抛出异常。您不会显示error,但如果不显示 扔一个异常,你永远不会到达catch块。

此外,cin >> option几乎肯定会留下新的一行 缓冲区,这可能会导致以后的问题,并且你输入的是什么 alpha,如果optionint类型,cin将输入错误 状态,需要清除(和错误的输入 去除)。所以在错误情况下(!cin),你需要调用 cin.clear(),在所有情况下,您可能都想打电话 cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' )

避免大多数这些问题的替代解决方案是 阅读完整的行(使用std::getline( std::cin, line )), 然后使用std::istringstream来解析该行。这将 让std::cin处于良好状态,并准备输入下一个 线。

答案 1 :(得分:0)

选项很可能是整数类型,因此cin不能将“a”读入其中,因此会被忽略。

这是你的情况吗?

您可以像这样修改它:

char option;
while(invalidOption2 == 0){
    try{
        cin>>option;
        if(!cin){
            error("invalid input");
        }
        if(option<'1' || option>'2'){
            error("invalid input");
        }
        if(option=='1') {
            invalidOption2 = 1;
            cout<<"option 1 was selected"<<endl;
        }
        else if(option=='2') {
            invalidOption2 = 1;
            cout<<"option 2 was selected"<<endl;
        }       
    }
    catch(runtime_error& e) { 
        cerr <<"Please enter a valid option" << endl;
    }
}

这应该与你期望的一样。

然而,这样的结构:

char option;
while (cin >> option) {
    if ((option == '1') || (option == '2')) {
        break;
    }
    else {
        cout << "Please enter 1 or 2." << endl;
    }
}
cout << "option " << option " << " was selected" << endl;

可能更好^ _ ^

答案 2 :(得分:0)

我认为这看起来更好(至少对眼睛而言):

int option;
int invalidOption2 = 0;

while(invalidOption2 == 0)
{
      try
      {
        cin>>option;
        switch(option)
        {       

        case 1 : 
            invalidOption2 = 1;
            cout<<"option 1 was selected"<<endl;   
            break;     
        case 2 : 
            invalidOption2 = 1;
            cout<<"option 2 was selected"<<endl;
            break;
        default : 
            error("invalid input");       

         }
      catch(runtime_error& e)
      { 
              cerr <<"Please enter a valid option" << endl;
      }
}

如果您仍然认为intcharcin有问题,请更好地使用:

option = getchar(); 

答案 3 :(得分:0)

我认为两次调用cin可能是问题,但我不确定。像这样的东西也应该运作良好:

char option[80]; // 80 is the standard terminal line length
bool loop = 1;
while(loop)
{
    cin >> option;
    if (option[1]=='\n') // testing if string is length 1
    {
        cout << "Please select a valid input\n";
        continue; // if not, display error and try again
    };
    switch(option[0])
    {
        case '1': loop=0; break; // add whatever before break
        case '2': loop=0; break;
        default: cout << "please select a valid input\n"; break;
    };
};
cout << "Option "<< option << "was selected\n";

我没有编译,但它应该没问题。