我有一个开关,其中一个案例要求用户提供几个用于构造类对象的输入 . 其中一个输入应采用数字形式 . 如果未输入数字,则会中断交换机并最终终止程序 . 我想设置一个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;
}
但结果是无限循环“输入一年的正面输入:” . 我知道这个用于错误检查的构造在交换机外壳之外工作,那么在一个交换机案例中我得到这个结果的原因是什么?另外,您将如何解决此问题,以便我可以检查并防止输入错误?谢谢 .
2 回答
您需要清除输入流 .
[为了解释我的自我更多的空间和更好的格式比评论更好我发布这个作为答案而不是评论 . ]
输入输入时,例如
输入缓冲区实际上包含两个字符,第一个是数字
'1'
,然后是换行符'\n'
.当您读取单个字符时,输入操作将提取第一个字符,数字,并将其写入变量 .
如果你然后读了另一个字符,它将读取换行符,而不是后面的内容 .
有一个诀窍"ignore"个字符,例如换行符,这是通过使用std::istream::ignore完成的,如果你按照参考链接进行操作,你会看到一个非常好的例子,说明如何忽略任何内容,包括新队 .
所以在你的情况下,仅仅调用
clear
是不够的,你需要在输入验证循环中调用ignore
. 如果你继续阅读单个字符,你也需要在此之前调用ignore
.