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”
任何帮助将不胜感激
答案 0 :(得分:1)
除非有{。},否则您无法访问"Please enter a valid option"
抛出异常。您不会显示error
,但如果不显示
扔一个异常,你永远不会到达catch块。
此外,cin >> option
几乎肯定会留下新的一行
缓冲区,这可能会导致以后的问题,并且你输入的是什么
alpha,如果option
是int
类型,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;
}
}
如果您仍然认为int
和char
与cin
有问题,请更好地使用:
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";
我没有编译,但它应该没问题。