main() 內部,應在全局作用域。struct Student stu[],調用傳 struct Student*,雖可隱式轉換但易混淆;更嚴重的是 scanf 格式字符串與參數不匹配(如 %s 對應 char* 卻傳了數組名無 &,或漏 &)。char place; char department; char major; 定義為單字符,實際需字符數組 char place[20];。FILE* fp; 未初始化即在函數中使用,且 main 中重複 fopen 導致邏輯混亂。pack 函數 rename 參數錯誤: rename("&student_tmp.dat", ...) 應為 rename("student_tmp.dat", ...)。scanf 緩衝區溢出風險: 無寬度限制,建議 %19s。while (select 2) 應為 while (select > 2 || select < 1) 等。main 前。StudentType* 作為函數參數,內部按指針算術訪問。main 中統一打開文件,傳遞 fp 給各功能函數,最後統一關閉。fgets/sscanf 替代 scanf 增強健壯性。不要一次性寫幾百行再編譯。采用「寫一個函數,編譯測試,再寫下一個」的增量開發模式。善用編譯器警告 (-Wall -Wextra),逐個消除警告。參考《C Primer Plus》或《C陷阱與缺陷》建立良好編程習慣。