【问题标题】:C++ Recursive Function Infinite LoopC++ 递归函数无限循环
【发布时间】:2017-05-31 06:21:15
【问题描述】:

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

这是我的完整代码 sn-p(49 行)

总结一下我要问的是,当给出非整数值时,我将如何正确地显示错误并返回主菜单而不触发无限循环。

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());
    }

}

【问题讨论】:

  • 如果一个函数声明返回一个值,但它实际上并没有这样做,那么你有未定义的行为。在你的情况下,有一个执行路径,你不'MainMenu函数返回任何东西。
  • 另外,你为什么使用递归调用而不是循环?在您的情况下,循环会更有意义。
  • 正如“一些程序员老兄”所说:在这里,您返回任何内容,但您必须返回:if (std::cin.fail()) { std::cout &lt;&lt; "Input must be an integer"; }
  • 最后,如果您输入的内容无法被int 输入运算符解析为int,则该输入将保留在输入缓冲区中并再次读取 下次您尝试输入时。这就是无限循环的原因。我建议您查看std::getlinestd::istringstream,或std::istream::ignore
  • 您需要使用 Loop .. 这更适合您的情况.. 您需要使用 (do while) 循环来处理它.. 以字符形式输入并检查用户是否输入了任何字符 esle 1,2,3 你可以简单地从中出来..

标签: c++ function recursion infinite-loop


【解决方案1】:

函数MainMenuSelection( int x ) 需要一个int。主函数中的函数调用认为它是通过调用一个应该返回一个 int 即int MainMenu() 的函数来实现的。但是这个函数并没有达到你对以这种方式声明的函数的期望。您应该确保函数应该始终返回值(当然除了 void)。

有像 Cppcheck 这样的静态代码分析器,它可以帮助您分析代码并发现可能出现的问题,就像您上面所说的那样。

另一个提示是考虑执行代码时会发生什么。尤其是当你的代码还很小的时候,你可以手动遍历语句来查看它的路径,这样你就可以找出程序失败的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2021-01-16
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多