在下面的方法中,我有一个名为myarr的二维字符数组和一个名为code的字符串。我使用计数器i遍历代码中的每个字符,并在myarr中查找与代码[i]匹配的字符。当我在myarr中找到与code [i]匹配的字符时,我想退出for for循环和if语句并返回到while循环的开头。我能想到这样做的唯一方法是使用goto语句。但是,一般不鼓励使用goto,所以我想知道是否还有其他方法可以实现这一点。
string decrypt(string code, char myarr[][5])
{
int r = 0;
int c = 0;
int i = 0;
string newstr = "";
while(i<code.length()-1)
{
//This is where I want to go back to
if (code[i] != ' ')
{
for (r = 0; r < 4; r++)
{
for (c = 0; c < 4; c++)
{
if (code[i] = myarr[r][c])
{
newstr += myarr[c][r];
i++;
//This is where I want to exit
}
}
}
}
else
{
newstr += " ";
i++;
}
}
return newstr;
}
答案 0 :(得分:1)
你使用flag-ish variabele。
在while循环的开头将boolean设置为true。 然后在满足条件时,将其设置为false。 在每个内部循环中,您还要检查该标志是否为真。
另外。在我看来,这是goto合理的案例之一。
答案 1 :(得分:1)
我要做的事情:
char decrypthelper(char codech, // returns the substitution character for codech
const char myarr[][5]) //const because we aren't changing myarr.
// This will make sure we don't, and maybe
// the compiler can do something sneaky.
{
if (codech != ' ')
{
for (int r = 0; r < 5; r++) // fixed off by one error
// declare index variable here. No one else needs it
{
for (int c = 0; c < 5; c++) // fixed off by one error
{
if (codech == myarr[r][c]) // was assignment not compare
{
return myarr[c][r]; // found substitution. Exit
}
}
}
}
else
{
return ' '; // space... the final frontier
}
return '?'; // unknown character
}
string decrypt(string code, char myarr[][5])
{
string newstr = "";
for (auto codech: code) // for each character in code
{
newstr += decrypthelper(codech, myarr); // add substitution character
}
return newstr;
}
我试图保持代码可识别。您可以使用大量其他技巧使您的工作变得更轻松,因此一旦您的程序启动并运行并且没有错误,请考虑Quentin关于要求code review的建议。 / p>
请注意,在某些圈子中查看函数中的许多返回与goto
一样糟糕。
答案 2 :(得分:-3)
正如其他人所提到的,你可以使用flag-ish变量。您还可以使用异常作为打破多个循环的方法。
您也可以将两个内部循环放入一个单独的函数中并使用return。
但是看一下代码为什么不改变算法呢?您应该创建一个从char到解密char的映射,这样您就可以使用:
newstr += map[code[i]];