死循环,找不到错误
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);
会好的。
我正在制作一个小程序供我自己和我在学校的任何朋友使用。我有一个名为 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);
会好的。