bool choose() {
int answer = 0;
while(answer != 1 || answer != 2) {
cout << endl << "Do you want to encrypt(enter 1) or decrypt(enter 2)?" << endl;
cin >> answer;
}
if(answer == 1) return true;
return false;
}
从行读取并将输入与整数进行比较的最佳方法是什么?
我知道方式cin
,gets
,getline(cin, answer)
。
我应该使用哪个以及为什么?
目前,这种方式无效,因为当我输入1或2时,它仍然保留在while
。
答案 0 :(得分:10)
您的情况不正确。到De Morgan's laws,您应该使用&&
代替。
while(answer != 1 && answer != 2) {
答案 1 :(得分:5)
您正在正确阅读该值。但是,循环条件错误;它应该是
while(answer != 1 && answer != 2)
使用||
使条件始终为真,因为没有数字等于1和2。
答案 2 :(得分:3)
此代码非常适合do-while
循环,如果您使用它,则不需要初始化变量answer
。
int answer; //= 0; no need to initialize!
do {
cout<<"Do you want to encrypt(enter 1) or decrypt(enter 2)?"<<endl;
cin >> answer;
}while(answer != 1 && answer != 2);
当然,你需要使用&&
,正如其他人已经指出的那样。 : - )
顺便说一句,如果用户输入任何非整数输入,如hgjkhg
,会发生什么? cin>>answer
无法读取输入,它将永远保留在那里,cin
的标志将被设置为失败,cin
将无法读取更多输入。这意味着,循环永远不会退出!
为了避免这种情况,并且为了使代码更加健壮和完整,您应该将其编写为:
int answer = 0;
while(answer != 1 && answer != 2) {
cout<<"Do you want to encrypt(enter 1) or decrypt(enter 2)?"<<endl;
if ( !(cin >> answer) )
{
cin.clear(); //clear the failure flag if there is an error when reading!
std::string garbage;
std::getline(cin, garbage); //read the garbage from the stream and throw it away
}
}
是。您可以使用while
循环代替do-while
。您只需在代码中添加if(!(cin>>answer)) { ... }
即可。 : - )