我正在为自己和我在学校的任何朋友制作一个小程序。我有一个名为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中的测试都以某种方式失败了。这里有什么我想念的吗?
答案 0 :(得分:4)
while (choice.compare("s") != 0 || choice.compare("p") != 0);
如果不是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);
这将是好事。