我已经编写了一个包含多个菜单的程序。我现在正在调试程序,我想在菜单选项中包含一些输入验证。但是,出于某种原因,当它检测到错误的输入时,它会使用goto
语句回到函数的开头(我知道,不好的做法:\)并且它会要求用户输入新的输入,但是如果输入正确,则无论如何都会返回到非允许输入的情况(默认)。有没有人知道发生了什么?
注:
select_variable_check(vector<int> , int)
是一个函数,用于检查输入的值是否已输入之前是否有任何相关性,但我认为它与之无关。
void select(vector<int>&select_control) {
char select;
choices:
cin >> select;
int selectint = select;
bool check = select_variable_check(select_control, selectint);
switch (select) {
case ('1','2','3','4','5','6','7','8','9','10'):
if (check == false) {
string city = city_selection(selectint);
double xcoor = xcoor_selection(selectint);
double ycoor = ycoor_selection(selectint);
cout << "\n" << city << "\n";
select_control.push_back(selectint);
cout << "\n Enter next city: ";
cin >> select;
selectint = select;
}
else {
cout << "You have already selected that city, please select another one ";
cin >> select;
}
break;
case '99': {
cout << "TERMINATING" << endl;
Sleep(3000);
exit(0);
break;
}
case '100': {
cout << "input complete" << endl;
break;
}
default: {
cout << "not a valid value, please try again" << endl;
goto choices;
break;
}
}
答案 0 :(得分:1)
('1','2','3','4','5','6','7','8','9','10')
的值为'10'
,因此它是触发第一个案例陈述的唯一值。写这个的正确方法是:
case '1':
case '2':
case '3':
...
尽管有这种变化,但'10'
是一种特殊的角色,而且几乎肯定不是正确的。
答案 1 :(得分:0)
您的代码归结为
start:
get_input
process_input
if good do something
else go to start
end:
现在,当您输入错误输入时,它会重新开始。您的输入操作将再次失败,因为输入流仍处于错误状态,因此您不会获得新输入,并且由于输入错误,您将返回开始。要停止此循环,您需要清除流上的错误标志并删除仍在缓冲区中的任何输入。这将使您的默认情况看起来像
default: {
cout << "not a valid value, please try again" << endl;
cin.clear(); // removes error flags
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // flushes input buffer
goto choices;
break;
}
您需要#include <limits>
才能使用cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')