c ++多条件匹配精确的字符串

时间:2016-10-25 14:17:14

标签: c++ loops while-loop

我希望找到变量的完全匹配"检查"。如果用户键入"键入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:

4 个答案:

答案 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;
   ...
}

在您的情况下,相同的模式将有助于修复程序逻辑 - 您不应该有代码,多次执行相同的操作(getlinetransform在您的情况下是重复的)。此外,当您尝试在函数中修复值时,您可以修改本地副本。因此,更好的实施将是:

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();
    ...
}