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

C++中传递结构体数组并更新数组的问题

问题分析与修复方案

  1. 参数类型错误:getAddEmployee函数参数写成了Data &employee(单个结构体引用),但实际要操作的是结构体数组,应改成Data employee[](和其他操作数组的函数一致)。数组传参时会自动转为指针,修改数组内元素会直接同步到外部全局数组,不需要额外传引用或返回数组。
  2. 硬编码索引问题:添加新员工时用了固定索引employee[10],会覆盖指定位置元素且无法正确添加到下一个空位。应使用当前count作为新元素索引,然后将count自增,确保每次添加到数组末尾。
  3. 函数返回类型冗余:getAddEmployee不需要返回Data类型,改成void即可,因为数组传参已为指针,修改会直接作用于外部数组。
  4. 重复定义函数:代码中重复写了两遍readFile函数,编译会报错,需删掉其中一个。
  5. 搜索逻辑错误:getEmployeeLast函数中只要第一个员工姓氏不匹配就直接退出程序,导致后续匹配项无法被找到。应遍历所有员工,记录是否找到匹配项,遍历结束后再判断是否输出“未找到”。

修改后的关键代码片段

修正getAddEmployee函数

void getAddEmployee(Data employee[], int& count) {
    string firstName, lastName, phoneNumber;
    int employeeID;

    // 打印当前员工列表
    for (int i = 0; i < count; i++)
        cout << employee[i].first_name << "\t\t\t" << employee[i].last_name << "\t\t" << employee[i].employee_id << "\t\t" << employee[i].phone_number << "\n ";
    cout << endl;

    cout << "当前员工数量: " << count << "\n";

    // 输入新员工信息
    cout << "请输入新员工的名字:\n";
    cin >> firstName;
    cout << "请输入新员工的姓氏:\n";
    cin >> lastName;
    cout << "请输入新员工的ID:\n";
    cin >> employeeID;
    cout << "请输入新员工的电话号码:\n";
    cin >> phoneNumber;

    // 用count作为索引添加新员工,更新计数
    employee[count].first_name = firstName;
    employee[count].last_name = lastName;
    employee[count].employee_id = employeeID;
    employee[count].phone_number = phoneNumber;
    count++;

    // 打印更新后的列表
    cout << "更新后的员工列表:\n";
    for (int i = 0; i < count; i++) {
        cout << employee[i].first_name << "\t\t\t" << employee[i].last_name << "\t\t" << employee[i].employee_id << "\t\t" << employee[i].phone_number << "\n ";
    }
}

修正getEmployeeLast函数

void getEmployeeLast(Data employee[], int& count) {
    string searchName;
    bool found = false; // 标记是否找到匹配项

    cout << "请输入要搜索的员工姓氏:\n";
    cin >> searchName;

    for (int i = 0; i < count; i++) {
        if (employee[i].last_name.find(searchName, 0) != std::string::npos) {
            cout << "找到匹配员工: " << employee[i].first_name << " " << employee[i].last_name << ", ID: " << employee[i].employee_id << ", 电话: " << employee[i].phone_number << "\n";
            found = true;
        }
    }

    if (!found) {
        cout << "未找到该姓氏的员工。\n";
    }
}

修正函数原型

把原来的Data getAddEmployee(Data &, int&);改成:

void getAddEmployee(Data [], int&);

删除重复的readFile函数

删掉代码中重复的第二个readFile定义。

完整修正后的代码

#include<iostream>
#include<iomanip>
#include<fstream>

using namespace std;

struct Data {
    string first_name;
    string last_name;
    int employee_id;
    string phone_number;
};

void readFile(ifstream&, string, Data [], int&);
void getEmployeeDetail(Data [], int&);
void getEmployeeLast(Data [], int&);
void getAddEmployee(Data [], int&);
void getRemoveEmployee();
void getManagerOnly();
void getStaffOnly();

const int SIZE = 15;
Data employee[SIZE];

int main() {
    ifstream inputFile;
    ofstream outputFile;
    int count = 0;
    int selection;
    const int EMPLOYEE_DETAIL = 1,
              EMPLOYEE_LAST = 2,
              ADD_EMPLOYEE = 3,
              REMOVE_EMPLOYEE = 4,
              MANAGER_ONLY = 5,
              STAFF_ONLY = 6,
              QUIT = 7;

    readFile(inputFile, "employeeData.txt", employee, count);

    do {
        cout << "\t 请选择操作选项:\n"
             << "1. 列出所有员工详细信息\n"
             << "2. 按姓氏搜索员工\n"
             << "3. 添加新员工\n"
             << "4. 删除员工\n"
             << "5. 仅显示经理\n"
             << "6. 仅显示普通员工\n"
             << "7. 退出程序\n"
             << "请输入你的选择:\n" << endl;
        cin >> selection;

        while (selection < EMPLOYEE_DETAIL || selection > QUIT) {
            cout << "请输入有效的选项编号:\n";
            cin >> selection;
        }

        switch (selection) {
            case EMPLOYEE_DETAIL:
                getEmployeeDetail(employee, count);
                break;
            case EMPLOYEE_LAST:
                getEmployeeLast(employee, count);
                break;
            case ADD_EMPLOYEE:
                getAddEmployee(employee, count);
                break;
            case REMOVE_EMPLOYEE:
                getRemoveEmployee();
                break;
            case MANAGER_ONLY:
                getManagerOnly();
                break;
            case STAFF_ONLY:
                getStaffOnly();
                break;
            case QUIT:
                cout << "程序结束\n";
                break;
        }
    } while (selection != QUIT);

    system("pause");
    return 0;
}

void readFile(ifstream& inputFile, string data, Data employee[], int &count) {
    inputFile.open(data);
    if (!inputFile) {
        cout << " 文件打开错误\n";
        exit(1);
    } else {
        while (inputFile >> employee[count].first_name >> employee[count].last_name >> employee[count].employee_id >> employee[count].phone_number) {
            count++;
        }
        inputFile.close();
    }
}

void getEmployeeDetail(Data employee[], int& count) {
    cout << "名字\t\t姓氏\t\t员工ID\t\t电话号码\n";
    cout << "--------------------------------------------------------------------------\n";
    for(int i = 0; i < count; i++)
        cout << employee[i].first_name << "\t\t" << employee[i].last_name << "\t\t" << employee[i].employee_id << "\t\t" << employee[i].phone_number << "\n";
    cout << endl;
}

void getEmployeeLast(Data employee[], int& count) {
    string searchName;
    bool found = false;

    cout << "请输入要搜索的员工姓氏:\n";
    cin >> searchName;

    for (int i = 0; i < count; i++) {
        if (employee[i].last_name.find(searchName, 0) != std::string::npos) {
            cout << "找到匹配员工: " << employee[i].first_name << " " << employee[i].last_name << ", ID: " << employee[i].employee_id << ", 电话: " << employee[i].phone_number << "\n";
            found = true;
        }
    }

    if (!found) {
        cout << "未找到该姓氏的员工。\n";
    }
}

void getAddEmployee(Data employee[], int& count) {
    string firstName, lastName, phoneNumber;
    int employeeID;

    cout << "当前员工列表:\n";
    for (int i = 0; i < count; i++)
        cout << employee[i].first_name << "\t\t\t" << employee[i].last_name << "\t\t" << employee[i].employee_id << "\t\t" << employee[i].phone_number << "\n ";
    cout << endl;

    cout << "当前员工数量: " << count << "\n";

    cout << "请输入新员工的名字:\n";
    cin >> firstName;
    cout << "请输入新员工的姓氏:\n";
    cin >> lastName;
    cout << "请输入新员工的ID:\n";
    cin >> employeeID;
    cout << "请输入新员工的电话号码:\n";
    cin >> phoneNumber;

    employee[count].first_name = firstName;
    employee[count].last_name = lastName;
    employee[count].employee_id = employeeID;
    employee[count].phone_number = phoneNumber;
    count++;

    cout << "新员工已添加,更新后的员工列表:\n";
    for (int i = 0; i < count; i++) {
        cout << employee[i].first_name << "\t\t\t" << employee[i].last_name << "\t\t" << employee[i].employee_id << "\t\t" << employee[i].phone_number << "\n ";
    }
}

void getRemoveEmployee() {
    // 待实现
}

void getManagerOnly() {
    // 待实现
}

void getStaffOnly() {
    // 待实现
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:46:13