死循环,找不到错误

Endless loop, can't find error

我正在制作一个小程序供我自己和我在学校的任何朋友使用。我有一个名为 getChoice() 的函数 (C++),returns 用户做出的选择:

std::string getChoice(const std::string& s)
{
    std::string choice;
    if (s == "sp")
    {
        do
        {
            std::cout << "Do you want to search for a video or play it? (s/p): ";
            std::cin >> choice;

            if (choice[0] == 'S' || choice[0] == 'P')
                choice[0] = tolower(choice[0]);

        } while (choice.compare("s") != 0 || choice.compare("p") != 0);
    }
    else if (s == "vidtype")
    {
        do
        {
            std::cout << "Do you want to use vine or yt? (vine/yt): ";
            std::cin >> choice;

        } while (choice.compare("vine") != 0 || choice.compare("yt") != 0);
    }

    else
    {
        std::cout << "Uh, this function only supports \"sp\" and \"vidtype\"\n\n";
        exit(EXIT_FAILURE);
    }

return choice;
}

我的问题是程序在

处陷入无限循环
"Do you want to search for a video or play it? (s/p): ";

我重写了整个程序,但没有解决问题。我查了一下使用 !=;看来我应该使用 std::string.compare()。 我也尝试在使用 std::cin 后输出选择。它在控制台输出中看起来很好,显示了 s 和 p,但是 do-while 中的测试都以某种方式失败了。我在这里遗漏了什么吗?

while (choice.compare("s") != 0 || choice.compare("p") != 0);

如果不是S或不是P:

  • 如果您输入 S,则不是 P 的计算结果为真,这将继续循环
  • 如果您输入 P,则不是 S 的计算结果为真,这将继续循环
  • 如果您输入 S 或 P 以外的任何内容,则两者都为真,这将继续循环。

您可能打算这样做:

while (choice.compare("s") != 0 && choice.compare("p") != 0);

如果不是 S 也不是 P(也就是 S 和 P 之外的其他字符)。


这个不正确的逻辑也出现在你的第二个循环中(谢谢你dwcanillas

while (choice.compare("vine") != 0 || choice.compare("yt") != 0);

改变while循环中的条件如下

    do
    {
        std::cout << "Do you want to search for a video or play it? (s/p): ";
        std::cin >> choice;

        if (choice[0] == 'S' || choice[0] == 'P')
            choice[0] = tolower(choice[0]);

    } while (choice.compare("s") != 0 && choice.compare("p") != 0);

当必须终止循环时,更容易考虑条件的否定。例如

!(choice.compare("s") != 0 && choice.compare("p") != 0)

或更直观

not (choice.compare("s") != 0 && choice.compare("p") != 0)

等同于

choice.compare("s") == 0 || choice.compare("p") == 0

所以当用户输入 "s" 或 "p" 然后退出循环。

问题出在线路上

while (choice.compare("s") != 0 || choice.compare("p") != 0); 

如果将逻辑更改为

while (choice.compare("s") == 0 || choice.compare("p") == 0);

会好的。