为什么循环没有中断?
Why is the loop not breaking?
我写了这个简单的菜单,它一直运行到我选择退出为止。每个选择函数只显示它被选中的消息。每个函数都放在 while (true) 循环中的 switch 语句中。它应该在函数运行一次后中断,但我得到了无限循环。我已经用 else if 语句尝试过它并且它工作正常。我想使用 switch,因为它看起来干净且易于管理。请告诉我逻辑错误,我会修复它。
#include <iostream>
#include <limits>
bool validation(int testChoice, int minC, int maxC, std::string message)
{
bool invalid = false;
if ((std::cin.fail())|| (testChoice >maxC) || (testChoice < minC))
{
std::cout << message <<std::endl;
invalid = true;
std::cin.clear();
std::cin.ignore(INT_MAX, '\n');
}
return invalid;
}
int menu()
{
bool flag = true;
int testChoice;
int minC = 1, maxC = 8;
do
{
std::cout <<"Which test to run?: \n";
std::cout <<"1. Test1 \n";
std::cout <<"2. Test2 \n";
std::cout <<"3. Test3 \n";
std::cout <<"4. Test4 \n";
std::cout <<"5. Test5 \n";
std::cout <<"6. Test6 \n";
std::cout <<"7. test7 \n";
std::cout <<"8. Quit \n";
std::cout <<"Pick one: ";
std::string message = "1-8 only: ";
std::cin >> testChoice;
flag = validation(testChoice, minC, maxC, message);
}
while(flag);
return testChoice;
}
void test1()
{
std::cout <<"Test 1 was chosen\n";
}
void test2()
{
std::cout <<"Test 2 was chosen\n";
}
void test3()
{
std::cout <<"Test 3 was chosen\n";
}
void test4()
{
std::cout <<"Test 4 was chosen\n";
}
void test5()
{
std::cout <<"Test 5 was chosen\n";
}
void test6()
{
std::cout <<"Test 6 was chosen\n";
}
void test7()
{
std::cout <<"Test 7 was chosen\n";
}
int toRun(int testChoice) //Pass in the return value from menu
{
while (true)
{
switch(testChoice)
{
case 1:
test1();
break;
case 2:
test2();
break;
case 3:
test3();
break;
case 4:
test4();
break;
case 5:
test5();
break;
case 6:
test6();
break;
case 7:
test7();
break;
case 8:
return 0;
}
}
}
int main ()
{
int choice = menu();
toRun(choice);
return 0;
}
您不会在 while (true)
中请求新的输入,因此它永远不会命中 return
语句,除非最初给出 8
。要解决此问题,只需更新循环内的 testChoice
变量即可。一个可能的解决方案是:
int toRun() // No parameter needed now
{
while (true)
{
int testChoice = menu();
switch(testChoice)
{
…
如果您希望它只 运行 一次,则完全删除 while
循环。
请注意 switch
内的 break
只会中断开关,而不是整个 while
循环!
switch 语句在执行测试用例后中断但循环继续,因为它的条件是 true
并且其他地方没有中断或 return 语句,除了 return
在 case 8
。这是您的代码可以正常工作的唯一情况。
I have tried it with else if statements and it worked properly.
这是因为在这种情况下 break
会中断您的 while
循环,而不是像 switch 语句那样中断 case
。
解法:
完全删除 while 循环,只保留其中的内容。您在那里不需要循环,实际循环发生在菜单内部(即 do-while 循环)。此外,为每个案例添加适当的 return 语句。目前,只有 case 8
有一个 return 语句。此外,我没有看到您使用 toRun
的 return 值。您也可以将其设为 void
并完全避免那些 return 语句。
我写了这个简单的菜单,它一直运行到我选择退出为止。每个选择函数只显示它被选中的消息。每个函数都放在 while (true) 循环中的 switch 语句中。它应该在函数运行一次后中断,但我得到了无限循环。我已经用 else if 语句尝试过它并且它工作正常。我想使用 switch,因为它看起来干净且易于管理。请告诉我逻辑错误,我会修复它。
#include <iostream>
#include <limits>
bool validation(int testChoice, int minC, int maxC, std::string message)
{
bool invalid = false;
if ((std::cin.fail())|| (testChoice >maxC) || (testChoice < minC))
{
std::cout << message <<std::endl;
invalid = true;
std::cin.clear();
std::cin.ignore(INT_MAX, '\n');
}
return invalid;
}
int menu()
{
bool flag = true;
int testChoice;
int minC = 1, maxC = 8;
do
{
std::cout <<"Which test to run?: \n";
std::cout <<"1. Test1 \n";
std::cout <<"2. Test2 \n";
std::cout <<"3. Test3 \n";
std::cout <<"4. Test4 \n";
std::cout <<"5. Test5 \n";
std::cout <<"6. Test6 \n";
std::cout <<"7. test7 \n";
std::cout <<"8. Quit \n";
std::cout <<"Pick one: ";
std::string message = "1-8 only: ";
std::cin >> testChoice;
flag = validation(testChoice, minC, maxC, message);
}
while(flag);
return testChoice;
}
void test1()
{
std::cout <<"Test 1 was chosen\n";
}
void test2()
{
std::cout <<"Test 2 was chosen\n";
}
void test3()
{
std::cout <<"Test 3 was chosen\n";
}
void test4()
{
std::cout <<"Test 4 was chosen\n";
}
void test5()
{
std::cout <<"Test 5 was chosen\n";
}
void test6()
{
std::cout <<"Test 6 was chosen\n";
}
void test7()
{
std::cout <<"Test 7 was chosen\n";
}
int toRun(int testChoice) //Pass in the return value from menu
{
while (true)
{
switch(testChoice)
{
case 1:
test1();
break;
case 2:
test2();
break;
case 3:
test3();
break;
case 4:
test4();
break;
case 5:
test5();
break;
case 6:
test6();
break;
case 7:
test7();
break;
case 8:
return 0;
}
}
}
int main ()
{
int choice = menu();
toRun(choice);
return 0;
}
您不会在 while (true)
中请求新的输入,因此它永远不会命中 return
语句,除非最初给出 8
。要解决此问题,只需更新循环内的 testChoice
变量即可。一个可能的解决方案是:
int toRun() // No parameter needed now
{
while (true)
{
int testChoice = menu();
switch(testChoice)
{
…
如果您希望它只 运行 一次,则完全删除 while
循环。
请注意 switch
内的 break
只会中断开关,而不是整个 while
循环!
switch 语句在执行测试用例后中断但循环继续,因为它的条件是 true
并且其他地方没有中断或 return 语句,除了 return
在 case 8
。这是您的代码可以正常工作的唯一情况。
I have tried it with else if statements and it worked properly.
这是因为在这种情况下 break
会中断您的 while
循环,而不是像 switch 语句那样中断 case
。
解法:
完全删除 while 循环,只保留其中的内容。您在那里不需要循环,实际循环发生在菜单内部(即 do-while 循环)。此外,为每个案例添加适当的 return 语句。目前,只有 case 8
有一个 return 语句。此外,我没有看到您使用 toRun
的 return 值。您也可以将其设为 void
并完全避免那些 return 语句。