无尽的循环,找不到错误

时间:2015-04-23 14:21:10

标签: c++ string comparison infinite-loop

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

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中的测试都以某种方式失败了。这里有什么我想念的吗?

3 个答案:

答案 0 :(得分:4)

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

如果不是S P:

  • 如果您输入S,而不是P将评估为true,这将继续循环
  • 如果您输入P,则不会将S评估为true,这将继续循环
  • 如果您输入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);

答案 1 :(得分:2)

以下列方式更改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

因此,当用户输入&#34; s&#34;或&#34; p&#34;然后退出循环。

答案 2 :(得分:0)

问题在于

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

如果您将逻辑更改为

while (choice.compare("s") == 0 || choice.compare("p") == 0);
这将是好事。