【问题标题】:C++ recursive function with switch() returns bad data带有 switch() 的 C++ 递归函数返回错误数据
【发布时间】:2015-06-07 14:12:48
【问题描述】:

我正在做一个需要显示一些菜单的项目,其中一些有子菜单。到目前为止,我已经创建了一个返回用户选择的字符的函数,问题是在菜单之间来回多次后返回值是垃圾,它与 cin 被刷新但我只是找不到必须清除的“点”... 我在不同的地方尝试了cin.clear();,结果好坏参半,我错过了什么?

输出:

#include <iostream>
#include <string>
#include <vector>
#include <exception>
#include <istream>
using namespace std;

char Menu() {
    char ch;
    //ch = NULL;
    //cin.clear();
    cout << "++++++++++++++++++++++++++++++++++++++++++++" << endl;
    cout << "+               MAIN MENU                  +" << endl;
    cout << "++++++++++++++++++++++++++++++++++++++++++++" << endl;
    cout << "| 1. Enter a new contract.                 |" << endl;
    cout << "| 2. Cancel an active conract.             |" << endl;
    cout << "| 3. Edit a cotract.                       |" << endl;
    cout << "| 0. Exit                                  |" << endl;
    cout << "++++++++++++++++++++++++++++++++++++++++++++" << endl;
    cin  >> ch; 

    switch (ch) {
        //cin.clear();
        case '1':
            return ch;
            break;
        case '2':
            return ch;
            break;
        case '3':
            //cin.clear();
             cout << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
             cout << "+                -== Edit a cotract ==-                  +" << endl;
             cout << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
             cout << " What would like to edit?                                |" << endl;
             cout << " a) Cover amount.                                        |" << endl;
             cout << " b) Add a family memeber.(Applyes to Health insurances)  |" << endl;
             cout << " 0. Return                                               |" << endl;
             cout << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl; 
             cin  >> ch;
             if(ch == '0') {       
                 //cin.clear();     
                 Menu();
             } else if((ch >= 'a') && (ch <= 'b')) {
                 return ch;
             } else {
                 cout << "Wrong input ! ! !" << endl;
                 Menu();
                 return ch;
            }
            break;
        case '0':
            cout << "Exiting bye!" << endl;
            break;
        default:
            cout << "Wrong input ! ! !" << endl;
            Menu();
            break;
    }         
}

int main() {
    char choise;
    choise = Menu();
    cout << "selected: " << choise << endl;

    system("PAUSE");
    return 0;
}

【问题讨论】:

  • 警告:控件可能到达非空函数[-Wreturn-type]的末尾
  • Dev-C++ 4.9.9.2 完全没有问题
  • @Peter 然后你不要在命令行上将-Wall 传递给 GCC。你实际上应该通过-Wall -Wextra -pedantic
  • 使这个函数递归是没有意义的,也是一个坏主意。这是因为调用 Menu() 并不会简单地跳到开头(就像 cough goto 那样),而是向堆栈添加了一个新的函数调用。当用户在那里选择 0 时,旧的函数调用会继续并在没有返回值的情况下退出函数,从而传递垃圾。
  • @ammoQ 我不知道,我以为我会用递归逃脱......

标签: c++ function recursion cin flush


【解决方案1】:
        default:
               cout << "Wrong input ! ! !" << endl;
               Menu();
               break;

您调用了另一个Menu() 来获取输入,但没有将其返回值返回给调用者main()

将其更改为return Menu();

【讨论】:

  • 这实际上有效,我将两个返回语句都放入'return Main()',但经过一些来回似乎再次“失去它”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 2017-05-09
  • 2021-06-18
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 2012-06-16
相关资源
最近更新 更多