我希望找到变量的完全匹配"检查"。如果用户键入"键入o"或"键入b",循环结束。我尝试了while (check != "type o"){...}
并且它有效,但没有第二个条件。我很迷惑。以下是我的代码。
void sunTypeCheck(string sunCheck){
string check = sunCheck;
transform(check.begin(), check.end(), check.begin(), ::tolower);
while (check != "type o" || check != "type b"){ //This is the problem.
cout << "Please enter a valid type of Sun. Try again: ";
getline(cin, check);
transform(check.begin(), check.end(), check.begin(), ::tolower);
}
}
这是我的主要方法。
int main(){
cout << "Please enter sun type: ";
getline(cin, typeOfSun);
sunTypeCheck(typeOfSun);
}
任何帮助将不胜感激。我在线查看并尝试使用&#34;比较&#34;但只要我包含第二个条件,它就不起作用,程序将始终返回Please enter a valid type of Sun. Try again:
答案 0 :(得分:2)
让我们应用de Morgans法律来了解我们拥有的东西:
check != "type o" || check != "type b"
等同于:
!(check == "type o" && check == "type b")
因此,只要check
不等于同时的两个字符串,循环就会继续。当然,这总是正确的,因为字符串是不同的。
答案 1 :(得分:2)
while条件变为false时循环中断。
check != "type o" || check != "type b"
注意:
||当其中一个条件返回true时,operator返回true
如果两者都是假的,则为假。
所以我们说你输入了#34;输入o&#34; 它会是这样的:
"type o" != "type o" || "type o" != "type b"
第一个条件返回false,第二个条件返回true。
false || true
所以当我在||的条件之一时,我说了什么运算符返回true?是的,这是真的。
所以要解决这个问题,你必须使用&amp;&amp;操作
while(check != "type o" && check != "type b")
修改强> for&amp;&amp;运算符,当其中一个条件为false时返回false,当且仅当两个条件都为真时返回true。
答案 2 :(得分:1)
while (check != "type o" && check != "type b")
答案 3 :(得分:1)
如果您很难理解条件中的负逻辑,请将其替换为正数:
while ( true ) {
if( check == "type o" || check == "type b") break;
...
}
在您的情况下,相同的模式将有助于修复程序逻辑 - 您不应该有代码,多次执行相同的操作(getline
和transform
在您的情况下是重复的)。此外,当您尝试在函数中修复值时,您可以修改本地副本。因此,更好的实施将是:
std::string getTypeOfSun()
{
string sun;
while( true ) {
cout << "Please enter a type of Sun: ";
getline( cin, sun );
transform(sun.begin(), sun.end(), sun.begin(), ::tolower);
if( sun == "type o" || sun == "type b")
break;
cout << "Invalid type of Sun, try again..." << endl;
}
return sun;
}
int main(){
string typeOfSun = getTypeOfSun();
...
}