C++ 递归函数无限循环
C++ Recursive Function Infinite Loop
我有一个函数,它从另一个函数中获取一个 int 值。当我输入错误的 int 值时,它会按预期工作(递归调用相同的函数并让我输入一个新数字)但是当我输入除 int(a、% 等)以外的任何内容时,它会递归调用该函数但卡在一个无限循环。任何 help/insight 都会很棒,因为我正处于 C++ 编程的学习阶段。
这是我的完整代码片段(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());
}
}
函数 MainMenuSelection( int x )
需要一个整数。主函数中的函数调用认为它是通过调用一个应该 return 一个 int 即 int MainMenu()
的函数来获取它的。但是这个函数并没有做你应该对以这种方式声明的函数所期望的。你应该确保一个函数应该总是 return 这个值(当然 void 除外)。
有像 Cppcheck 这样的静态代码分析器可以帮助您分析您的代码并找出您上面提到的可能存在的问题。
另一个提示是考虑执行代码时会发生什么。尤其是当你的代码还很小的时候,你可以手动遍历语句,看看它走的是什么路径,这样你就可以找出程序失败的地方。
我有一个函数,它从另一个函数中获取一个 int 值。当我输入错误的 int 值时,它会按预期工作(递归调用相同的函数并让我输入一个新数字)但是当我输入除 int(a、% 等)以外的任何内容时,它会递归调用该函数但卡在一个无限循环。任何 help/insight 都会很棒,因为我正处于 C++ 编程的学习阶段。
这是我的完整代码片段(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());
}
}
函数 MainMenuSelection( int x )
需要一个整数。主函数中的函数调用认为它是通过调用一个应该 return 一个 int 即 int MainMenu()
的函数来获取它的。但是这个函数并没有做你应该对以这种方式声明的函数所期望的。你应该确保一个函数应该总是 return 这个值(当然 void 除外)。
有像 Cppcheck 这样的静态代码分析器可以帮助您分析您的代码并找出您上面提到的可能存在的问题。
另一个提示是考虑执行代码时会发生什么。尤其是当你的代码还很小的时候,你可以手动遍历语句,看看它走的是什么路径,这样你就可以找出程序失败的地方。