我有一个开关,其中一种情况要求用户提供多个输入以用于构造类对象。这些输入之一应该是数字形式。如果没有输入数字,它会中断开关并最终终止程序。我想设置一个 while(){} 条件,这样如果输入非整数,它会提示用户输入一个整数,然后继续执行程序。
int main(){
int in_yob, ranking;
string in_first_name, in_last_name, in_genre, in_fact, last_name, in_composer;
char selection, choice;
do {
DisplayMenu();
cin >> selection;
cout << endl;
while (!cin || selection < 48 || selection > 53){
cin.clear();
cout << "Please make a valid selection" << endl;
DisplayMenu();
cin >> selection;
}
switch (selection) {
case 49 : {
cout << "First Name: ";
cin >> in_first_name;
cout << "Last Name: ";
cin >> in_last_name;
cout << "Genre: ";
cin >> in_genre;
cout << "Year of Birth: ";
cin >> in_yob;
cout << "Fact: ";
cin >> in_fact;
last_name = in_last_name;
transform(last_name.begin(), last_name.end(), last_name.begin(), ::tolower);
Composer& last_name = myDB.AddComposer(in_first_name, in_last_name,
in_genre, in_yob, in_fact);
cin.clear();
} break;
...
default:
cout << "Please make a valid selection" << endl;
}
} while (selection != 48);
}
我试过在 cin >> in_yob;
之后插入一个 while 循环:
while(!cin || in_yob > 1){
cin.clear();
cout << "Enter a positive enter for year of birth: ";
cin >> in_yob;
}
但结果是无限循环“Enter a positive enter for year of birth:”。我知道这种用于错误检查的构造在 switch case 之外工作,那么在 switch case 中我得到这个结果的原因是什么?另外,您将如何解决这个问题,以便我可以检查并防止输入错误?谢谢。
最佳答案
[为了用比在评论中更多的空间和更好的格式来解释我自己,我将其发布为答案而不是评论。]
当你输入输入的时候,比如
1
输入缓冲区实际上包含两个字符,第一个是数字'1'
,然后是换行符'\n'
。
当您读取单个字符时,输入操作会提取第一个字符,即数字,并将其写入您的变量。
如果您随后读取另一个字符,它将读取换行符,而不是后面的任何内容。
有一个技巧可以“忽略”字符,例如换行符,这是通过使用 std::istream::ignore
来完成的。 ,如果您点击引用链接,您将看到一个很好的示例,说明如何忽略包括换行符在内的任何内容。
因此,在您的情况下,仅调用 clear
是不够的,您还需要在输入验证循环中调用 ignore
。如果继续读取单个字符,则还需要在此之前调用 ignore
。
关于c++ - 使用 while 循环检查 switch case 中的输入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31434923/