C 語言初學者常在 printf 格式字符串中忘記佔位符,導致變量不被打印,甚至影響後續輸入。本文通過一個學生成績統計程序,指出並修正這個經典錯誤。
printf("\t請輸入第%d學生的數據,i+1"); // 錯誤:逗號在雙引號內,非格式化輸出
請輸入第%d學生的數據,i+1i+1 未被計算顯示scanf 正常工作,但用戶體驗差
printf("\t請輸入第%d學生的數據", i+1); // 正確:佔位符在引號內,變量在引號外
程序功能:輸入 5 名學生的學號、姓名、3 門課成績 → 自動計算平均分 → 格式化輸出。
struct STUDENT {
char id[10];
char name[8];
int score[3];
double ave;
} stu[5];
for (i = 0; i < num; i++) {
printf("\t請輸入第%d學生的數據", i+1); // 修正點
printf("\t學號:"); scanf("%s", stu[i].id);
printf("\t姓名:"); scanf("%s", stu[i].name);
int Tave = 0;
for (j = 0; j < 3; j++) {
printf("\t第%d門課的成績:", j+1);
scanf("%d", &stu[i].score[j]);
Tave += stu[i].score[j];
}
stu[i].ave = (double)Tave / 3.0;
}
printf("\n\t學號\t姓名\t成績1\t成績2\t成績3\t平均分\n");
for (i = 0; i < num; i++) {
printf("\t%s\t%s", stu[i].id, stu[i].name);
for (j = 0; j < 3; j++) printf("\t%d", stu[i].score[j]);
printf("\t%.2f\n", stu[i].ave); // 建議保留兩位小數
}
scanf 返回值,防止非數字輸入導致死循環fgets 替代 scanf("%s") 讀取姓名,支持包含空格的名字#define STUDENT_NUM 5 避免魔術數字int:int main() { ... return 0; }printf 格式字符串與參數分離是 C 語言基礎語法,務必牢記:「佔位符在引號內,變量在引號外,用逗號分隔」。開啟編譯器警告(-Wall -Wformat)可自動檢測此類錯誤。