【发布时间】: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 << "Input must be an integer"; }。 -
最后,如果您输入的内容无法被
int输入运算符解析为int,则该输入将保留在输入缓冲区中并再次读取 下次您尝试输入时。这就是无限循环的原因。我建议您查看std::getline和std::istringstream,或std::istream::ignore。 -
您需要使用 Loop .. 这更适合您的情况.. 您需要使用 (do while) 循环来处理它.. 以字符形式输入并检查用户是否输入了任何字符 esle 1,2,3 你可以简单地从中出来..
标签: c++ function recursion infinite-loop