print() 與 save() 函數中 printf/fprintf 格式字符串包含 %d,但對應參數為 double(如 stu[i].score.yuwen),導致棧參數解析錯位,後續浮點數輸出全為 0.0。
printf("%s\t%s\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",
stu[i].num, stu[i].name, stu[i].sex,
stu[i].score.yuwen, // ❌ 這裡應為 %d 對應 age,但傳了 double
stu[i].score.math, ...);
參數順序應為:num, name, sex, age, yuwen, math, english, tiyu, sum,格式符對應 %s %s %s %d %.1f %.1f %.1f %.1f %.1f。
void printstudent(int i) {
printf("%s\t%s\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",
stu[i].num, stu[i].name, stu[i].sex, stu[i].age,
stu[i].score.yuwen, stu[i].score.math,
stu[i].score.english, stu[i].score.tiyu, stu[i].score.sum);
}
print() 和 save() 同理修正。此外,循環 for(i=5;i>0;i--) 應為 for(i=0;i<stnum;i++),否則漏打印且越界。
-Wformat 警告,編譯期即可發現格式符不匹配。