C语言员工管理程序问题:无法传递AddEmployeeNumber定义数组大小
问题分析与代码修正
核心问题梳理
- 结构体定义与使用混乱,typedef命名和后续struct引用不统一
- 局部数组存储员工数据,函数结束后数据丢失,无法传递到打印函数
- 打印函数未接收员工数量和实际数据,反而重新定义数组,逻辑错误
- 函数参数类型不匹配,返回值类型错误
- 结构体成员定义冗余(每个员工不需要数组存储单个属性)
- 输入输出时的数组越界问题
修正后的完整代码
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> // 用于malloc/free // 定义员工结构体,每个员工对应单个属性,无需数组 typedef struct Employee { char name[20]; // 扩大名字长度避免截断 float hours_worked; float hourly_rate; } Employee; // 通过指针返回员工数量,返回值为动态分配的员工数组指针 Employee* AddEmployee(int* employee_count) { printf("How Many Employees Do You Want To Add: "); scanf("%d", employee_count); // 动态分配内存,避免局部变量销毁丢失数据 Employee* employees = (Employee*)malloc(*employee_count * sizeof(Employee)); if (employees == NULL) { printf("Memory allocation failed!\n"); *employee_count = 0; return NULL; } for (int i = 0; i < *employee_count; i++) { printf("Enter name for employee %d: ", i+1); scanf("%s", employees[i].name); // 直接传数组名,无需取地址 printf("Enter hours worked for employee %d: ", i+1); scanf("%f", &employees[i].hours_worked); printf("Enter hourly rate for employee %d: ", i+1); scanf("%f", &employees[i].hourly_rate); printf("\n"); } return employees; } // 打印函数接收员工数组指针和数量 void PrintingAllEmployees(Employee* employees, int employee_count) { if (employee_count == 0 || employees == NULL) { printf("No employees to print!\n"); return; } printf("--- All Employee Information ---\n"); for (int i = 0; i < employee_count; i++) { printf("Employee %d:\n", i+1); printf("Name: %s\n", employees[i].name); printf("Hours Worked: %.2f\n", employees[i].hours_worked); printf("Hourly Rate: %.2f\n", employees[i].hourly_rate); printf("------------------------\n"); } } int main() { int choice; Employee* employees = NULL; int employee_count = 0; while (1) // 用无限循环替代赋值式判断,逻辑更清晰 { printf("Main Menu\n"); printf("1: Add Employee\n"); printf("2: Edit Employee\n"); printf("3: Print A Employee\n"); printf("4: Print All Employees\n"); printf("5: Quit\n"); printf("Enter Which Section You Want To Access: "); scanf("%d", &choice); switch (choice) { case 1: // 若已有员工数据,先释放内存避免泄漏 if (employees != NULL) { free(employees); } employees = AddEmployee(&employee_count); break; case 2: printf("Edit function not implemented yet.\n"); break; case 3: printf("Print single employee function not implemented yet.\n"); break; case 4: PrintingAllEmployees(employees, employee_count); break; case 5: // 退出前释放动态分配的内存 if (employees != NULL) { free(employees); } return 0; default: printf("Sorry, invalid choice.\n"); break; } printf("\n"); } return 0; }
关键修改说明
- 结构体修正:将结构体成员从数组改为单个值,每个员工对应唯一的名字、工时和时薪,避免冗余和越界。
- 动态内存分配:用
malloc在堆上分配员工数组,替代局部栈数组,确保数据能在函数间传递,不会随函数结束销毁。 - 参数传递优化:
AddEmployee通过指针返回员工数量,返回值为员工数组指针;PrintingAllEmployees接收数组指针和数量,明确数组大小。 - 函数类型修正:打印函数无需返回值,改为
void;员工数量用int类型,避免不必要的float转换。 - 循环与调用修正:修复while循环的赋值错误(原
while(x=1)是赋值而非判断);调用打印函数时直接传递已有的数组指针和数量,而非重新定义类型。 - 内存管理:添加内存释放逻辑,避免内存泄漏;增加空指针判断,提升程序稳定性。
- 输入输出优化:修正scanf的地址传递错误,扩大名字数组长度避免截断,打印时保留两位小数更美观。
内容的提问来源于stack exchange,提问作者Harvey Yang
相关产品推荐
相关产品推荐

