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

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;
}

关键修改说明

  1. 结构体修正:将结构体成员从数组改为单个值,每个员工对应唯一的名字、工时和时薪,避免冗余和越界。
  2. 动态内存分配:用malloc在堆上分配员工数组,替代局部栈数组,确保数据能在函数间传递,不会随函数结束销毁。
  3. 参数传递优化:AddEmployee通过指针返回员工数量,返回值为员工数组指针;PrintingAllEmployees接收数组指针和数量,明确数组大小。
  4. 函数类型修正:打印函数无需返回值,改为void;员工数量用int类型,避免不必要的float转换。
  5. 循环与调用修正:修复while循环的赋值错误(原while(x=1)是赋值而非判断);调用打印函数时直接传递已有的数组指针和数量,而非重新定义类型。
  6. 内存管理:添加内存释放逻辑,避免内存泄漏;增加空指针判断,提升程序稳定性。
  7. 输入输出优化:修正scanf的地址传递错误,扩大名字数组长度避免截断,打印时保留两位小数更美观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:24:18