对于这个循环,我需要能够将名称输入到一个必须长度为100个元素的数组中,并在输入Q或q后退出数组以读取名称,或者到达数组的末尾。当我使用这段代码时,程序会回到while循环的开头而不会破坏for循环。
for (int i = 0; i < 100; i++)
{
while (true)
{
cout << "Enter Player Name (Q to quit): ";
getline(cin,playerName[i]);
if (playerName[i] == "Q" || playerName[i] == "q")
break;
cout << "Enter score for " << playerName[i] << ": "<< endl << endl;
}
}
答案 0 :(得分:6)
根据您的描述,似乎while (true)
完全是多余的!!!
所以你应该这样做:
int i;
for (i = 0; i < 100; i++)
{
cout << "Enter Player Name (Q to quit): ";
getline(cin,playerName[i]);
if (playerName[i] == "Q" || playerName[i] == "q")
break;
cout << "Enter score for " << playerName[i] << ": "<< endl << endl;
}
此时,您可以使用i
来告知用户输入的名称数量。
答案 1 :(得分:2)
这是一种罕见的情况,其中明智的goto
可能是最佳选择。
for (...)
{
while (...)
{
if (...)
goto exit_loop;
}
}
exit_loop:;
有些语言允许您在for
上添加标签并在break
中使用它,但C和C ++不在其中。将整个循环嵌套提取到自己的函数也是有意义的,允许您使用return
退出两个循环,但这可能不适用于上下文。
我个人认为goto
的使用比外部循环中的布尔+ if
更容易理解,正如其他答案中所建议的那样,但合理的人可能会对此不以为然。
答案 2 :(得分:2)
如果我正确地阅读你的问题,那么你不需要while循环。如果没有while循环,break将退出for循环,然后你可以输入一个单独的for循环(从1到100)来打印数组的内容。
如果用户在任何时候输入的名称少于100个,则第二个for循环将从1变为i,并在此过程中输出每个数组条目。
答案 3 :(得分:1)
我正在回答标题 - 在函数中包装两个循环:
void foo()
{
for (;;)
while (true)
if (/* something */)
return;
}
我不同意barak manos,你甚至不需要两个循环。
答案 4 :(得分:0)
添加一个布尔变量来告诉你内部循环是否已经破坏:
bool broken = false;
for (int i = 0; i < 100; i++)
{
while (true)
{
cout << "Enter Player Name (Q to quit): ";
getline(cin,playerName[i]);
if (playerName[i] == "Q" || playerName[i] == "q") {
broken = true;
break;
}
}
cout << "Enter score for " << playerName[i] << ": "<< endl << endl;
}
if (broken) {
break;
}
}
答案 5 :(得分:0)
使用布尔变量来声明你从内部循环中断开然后检查它并在需要时从外部循环中断。
答案 6 :(得分:0)
尝试以下
bool done = false;
int i = 0;
for ( ; i < 100 && !done; i++ )
{
cout << "Enter Player Name (Q to quit): ";
getline(cin,playerName[i]);
if ( !( done = playerName[i] == "Q" || playerName[i] == "q" ) )
{
cout << "Enter score for " << playerName[i] << ": "<< endl << endl;
// some code for entering the score
}
}
考虑到您需要保持变量i以了解输入了多少玩家。所以我在循环之外定义了我。