【发布时间】:2015-10-04 18:15:15
【问题描述】:
我有一个开关,其中一种情况要求用户输入几个输入以用于构造类对象。这些输入之一应该是数字的形式。如果没有输入数字,它会破坏开关并最终终止程序。我想设置一个 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;
}
但结果是“输入一个正数的出生年份:”的无限循环。我知道这个用于错误检查的构造在开关盒之外工作,那么在开关盒中我得到这个结果的原因是什么?另外,您将如何解决此问题,以便我可以检查并防止输入错误?谢谢。
【问题讨论】:
-
什么是
selection?它是什么类型的?以及为什么与幻数进行比较而不是使用例如std::isdigit以确保您有数字?或者至少使用正确的字符文字,例如'0'而不是神秘的48。 -
输入一个负数会给你一些线索。
-
@JoachimPileborg 选择是
char,而且这个数字并不神奇。它是用户菜单选择的字符代码。 -
“幻数”是"Unnamed numerical constant",对于您的代码的读者来说,它只是一个没有任何特殊含义的数字。字符文字
'0'具有含义,给出了一些上下文,并且无论字符编码如何始终是可移植的,“幻数”48可以表示任何含义,并且不适用于不是从 ASCII 派生的编码。 -
另外,由于
selection是一个字符,您的输入验证功能将无法按预期工作,第二个输入操作将读取您为第一个输入操作输入的换行符。
标签: c++ oop while-loop switch-statement