1
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

4 回答 4

1

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

此外,cin >> option几乎可以肯定会在缓冲区中留下新行,这可能会导致以后出现问题,并且当您输入 alpha 时,如果option是 type intcin将进入错误状态,需要清除(并删除错误输入)。因此,在错误情况下 ( !cin),您需要调用 cin.clear(),并且在所有情况下,您可能都想调用 cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' )

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

于 2013-05-20T08:04:48.280 回答
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;

应该会更好^_^

于 2013-05-20T07:34:25.053 回答
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;
      }
}

如果你仍然认为你有问题int,那么最好使用:charcin

option = getchar(); 
于 2013-05-20T09:38:53.057 回答
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";

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

于 2013-05-20T11:00:30.080 回答