C ++递归函数无限循环

时间:2017-05-31 06:21:15

标签: c++ function recursion infinite-loop

我有一个从另一个函数获取int值的函数。当我键入一个错误的int值时,它按预期工作(递归调用相同的函数并让我输入一个新数字)但是当我输入除int(a,%等)以外的任何东西时,它会递归地调用该函数但会卡住在无限循环中。当我处于C ++编程的学习阶段时,任何帮助/见解都会很棒。

这是我的完整代码段(49行)

总结我的问题是,如果给出非int值,我将如何正确地显示错误并返回主菜单而不会触发无限循环。

int MainMenu();
void MainMenuSelection(int x);

int main()
{
    MainMenuSelection(MainMenu());
    return 0;
}

int MainMenu() {
    int selection;
    std::cout << "C++ Tutorials Main Menu\n";
    std::cout << "----------------------------------------------\n";
    std::cout << "1 - Chapter #1\n";
    std::cout << "2 - Chapter #2\n";
    std::cout << "3 - Chapter #3\n";
    std::cout << "----------------------------------------------\n";
    std::cout << "Please enter a cooresponding value: ";
    std::cin >> selection;

    if (std::cin.fail()) {
        std::cout << "Input must be an integer";
    }
    else {
        return selection;
    }
}

void MainMenuSelection(int x) {

    if (x == 1) {
        std::cout << "\nChapter #1 is unavailable.\n";
        std::cout << std::string(22, '\n');
        MainMenuSelection(MainMenu());
    }
    else if (x == 2) {
        std::cout << std::string(2, '\n');
        ChTwoMenuSelection(ChTwoMenu());
    }
    else if (x == 3) {
        std::cout << std::string(2, '\n');
        ChThreeMenuSelection(ChThreeMenu());
    }
    else {
        std::cout << "\nThere was an incorrect value submitted.";
        std::cout << std::string(22, '\n');
        MainMenuSelection(MainMenu());
    }

}

1 个答案:

答案 0 :(得分:0)

函数MainMenuSelection( int x )需要一个int。 main函数中的函数调用认为通过调用应该返回int int MainMenu()的函数来获取它。但是这个函数没有按照你用这种方式声明的函数所期望的那样。你应该确保一个函数应该总是返回值(除了当然是空的)。

像Cppcheck这样的静态代码分析器可以帮助您分析代码并找到可能出现的问题,如上所述。

另一个提示是考虑执行代码时会发生什么。特别是当您的代码仍然非常小时,您可以手动浏览语句以查看它所采用的路径,这样您就可以找到程序失败的位置。