C++中传递结构体数组并更新数组的问题
问题分析与修复方案
- 参数类型错误:
getAddEmployee函数参数写成了Data &employee(单个结构体引用),但实际要操作的是结构体数组,应改成Data employee[](和其他操作数组的函数一致)。数组传参时会自动转为指针,修改数组内元素会直接同步到外部全局数组,不需要额外传引用或返回数组。 - 硬编码索引问题:添加新员工时用了固定索引
employee[10],会覆盖指定位置元素且无法正确添加到下一个空位。应使用当前count作为新元素索引,然后将count自增,确保每次添加到数组末尾。 - 函数返回类型冗余:
getAddEmployee不需要返回Data类型,改成void即可,因为数组传参已为指针,修改会直接作用于外部数组。 - 重复定义函数:代码中重复写了两遍
readFile函数,编译会报错,需删掉其中一个。 - 搜索逻辑错误:
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
相关产品推荐
相关产品推荐

