char sex; 只能存一字符,實際需字符串 char sex[4];同理 degree、position、address、phone 均需數組;struct employee emp[80]; 污染全局命名空間,應封裝在模塊內;scanf("%s", &employee[i].name) 多取址、無長度限制、緩衝區殘留換行符導致死循環;strcpy,應整結構體交換或建立索引數組;stud 變量,字段不匹配;char s[20], s, m; 重複定義,switch(s) 應為 switch(c) 且 case 標簽缺單引號。
// employee.h
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
typedef struct {
char name[32];
char sex[8];
int birthday; // 建議用 time_t 或 yyyymmdd int
int work_year;
char degree[16];
char position[32];
char address[64];
char phone[16];
} Employee;
typedef struct {
Employee* data;
size_t size;
size_t capacity;
} EmpSystem;
// 介面函數
EmpSystem* sys_create(size_t init_cap);
void sys_destroy(EmpSystem* sys);
bool sys_add(EmpSystem* sys, const Employee* e);
bool sys_del_by_name(EmpSystem* sys, const char* name);
Employee* sys_find_by_name(const EmpSystem* sys, const char* name);
void sys_sort_by_name(EmpSystem* sys);
void sys_print_all(const EmpSystem* sys);
bool sys_save(const EmpSystem* sys, const char* filepath);
bool sys_load(EmpSystem* sys, const char* filepath);
#endif
Employee tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; 一次性搞定所有字段;sys_save/load 實現 CSV/二進制/JSON 多格式,業務邏輯零感知;bool,詳細錯誤輸出到 stderr。
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(EmpSys C)
set(CMAKE_C_STANDARD 11)
add_executable(emp_sys main.c employee.c)
target_compile_options(emp_sys PRIVATE -Wall -Wextra -Wpedantic -Werror -fsanitize=address,undefined)
教學代碼的價值在於「跑通流程」,工程代碼的價值在於「可維護、可擴展、可測試」。別停在第一步,嘗試重寫、模塊化、加測試、上 CI,這才是從學生到工程師的必經之路。