代碼中使用 scanf("%d%c%d%d%d%d%d", ...) 讀取結構體數組,存在多個關鍵錯誤導致輸入失敗、數據亂碼。
%d%c%d%d%d%d%d),但傳入地址僅 6 個(num, M, E, Chi, P, Che),最後一個 %d 無對應變量,導致棧平衡破壞。%c 讀取整型字段: 結構體中 char c[6] 是字符數組,但用 %c 讀取單字符,且對應參數為 &student[i].M(int 類型),會將輸入字符的 ASCII 碼低位存入 int 變量,高位保留垃圾值,導致 M 變為巨大或負數。student[3] 未初始化,成員含隨機垃圾值,sum 計算結果不可預期。%c 會讀取緩衝區中的換行符/空格,建議用 %s 讀取字符串或在 %c 前加空格 " %c" 跳過空白字符。#include <stdio.h>
#include <string.h>
struct Score {
int num;
char id[7]; // 假設存學號字符串
int M, E, Chi, P, Che;
int sum;
};
int main() {
struct Score student[3] = {0}; // 初始化歸零
for (int i = 0; i < 3; i++) {
// 格式:學號(int) ID字符串 五門成績
// 輸入示例:1001 STU001 85 90 78 88 92
if (scanf("%d %6s %d %d %d %d %d",
&student[i].num, student[i].id,
&student[i].M, &student[i].E, &student[i].Chi,
&student[i].P, &student[i].Che) != 7) {
printf("輸入格式錯誤\n");
return 1;
}
student[i].sum = student[i].M + student[i].E + student[i].Chi
+ student[i].P + student[i].Che;
}
for (int i = 0; i < 3; i++) {
printf("num=%d\tid=%s\tM=%d\tE=%d\tChi=%d\tP=%d\tChe=%d\tsum=%d\n",
student[i].num, student[i].id,
student[i].M, student[i].E, student[i].Chi,
student[i].P, student[i].Che, student[i].sum);
}
return 0;
}
%s 或 %[],限制寬度防溢出。scanf 返回值確保讀取成功。