在不使用Goto的情况下遇到条件时突破多个循环(C ++)

时间:2018-03-06 16:08:03

标签: c++ loops

在下面的方法中,我有一个名为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;
}

3 个答案:

答案 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]];