You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++菜单程序case 'C'处'name'未在当前作用域声明报错排查

错误诱因

报错核心是C++的局部变量作用域限制:

  • 你定义的三个并行数组name、surname、hoursWorked是main()函数内的局部变量,仅能在main()的大括号范围内被访问。
  • 你在独立的menuDisplay()函数的case 'C'分支里直接使用这三个变量,但menuDisplay()既没有定义这三个变量,也没有把它们设为入参接收,编译器在当前函数作用域找不到对应变量声明,就会抛出该错误。

另外现有代码还有两处逻辑问题:

  1. main()里调用完menuDisplay()后,无条件直接调用了一次getEmpDetails(),不管用户菜单选什么,程序启动后都会强制要求录入10条员工信息,不符合菜单交互的设计。
  2. do-while循环判断条件写反了:当前逻辑是输入C/L/A/S/E这些合法选项就一直循环,输入非法值才退出,还把无效选择提示放在了循环外面,完全不符合正常菜单的交互逻辑。
修复方法
  • 第一步:修改menuDisplay的函数声明和实现,增加三个数组入参,让函数可以接收外部传入的员工数组。
    原函数声明:
    void menuDisplay();
    
    修改为:
    void menuDisplay(string name[], string surname[], int hoursWorked[]);
    
    同步把menuDisplay函数实现的头部改成和声明一致的参数列表。
  • 第二步:调整main()函数逻辑,删掉main里多余的提前调用getEmpDetails()的语句,调用菜单时把三个数组作为参数传入即可,修改后的main核心代码:
    int main()
    {
        // 并行数组声明保持原有逻辑不变
        string name[10];
        string surname[10];
        int hoursWorked[10];
        
        // 传入数组调用菜单,移除原有多余的getEmpDetails调用
        menuDisplay(name, surname, hoursWorked); 
        return 0;
    }
    
  • 第三步:修正do-while循环逻辑,把无效输入提示放到循环内,调整循环终止条件为用户输入'E'时退出,修正后的menuDisplay核心逻辑:
    void menuDisplay(string name[], string surname[], int hoursWorked[]){
        char choice;
        do{
            cout << "[C]apture Employee details" << endl;
            cout << "[L]ist Employee details" << endl;
            cout << "[A]ll Employee Payslips" << endl;
            cout << "[S]ingle Employee Payslips" << endl;
            cout << "[E]xit" << endl;
            cin >> choice;
            
            switch(choice){
                case 'C':
                    cout << "capture employee details" << endl;
                    getEmpDetails(name, surname, hoursWorked);
                    break;
                case 'L':
                    cout << "list employee details" << endl;
                    break;
                case 'A':
                    cout << "All Employee Payslips" << endl;
                    break;
                case 'S':
                    cout <<"Single employee payslips" << endl;
                    break;
                case 'E':
                    cout << "Exit" << endl;
                    break;
                default:
                    cout << "invalid choice, please choose either C,L,A,S,E" <<endl;
            }
        }while(choice != 'E'); // 仅当输入E时退出菜单循环
    }
    

注:原代码中提示语的"invaild"为拼写错误,正确拼写为invalid。

内容的提问来源于stack exchange,提问作者newtothis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:39:10