struct Student {
char name[20];
char stunum[11]; // 假設長度 10
char sex;
};
scanf("%s %s %c", student[0].name, student[0].stunum, &student[0].sex);
// 輸入: Xiaoming 2015000000 F
// 結果: stunum="2015000000F", sex='F'
stunum 定義長度 11(含結束符 \0),輸入學號 2015000000 共 10 字符,scanf("%s") 讀取 10 字符 + \0 共 11 字節,**剛好填滿**,無空間存放結束符(或編譯器對齊導致 sex 緊隨其後)。後續 %c 讀取下一非空白字符 F,但 stunum 未正確結束,打印時作為字符串一直讀到 F 才遇到 \0。
char stunum[20],預留足夠空間。scanf("%10s", stunum) 最多讀 10 字符,保留 1 字節給 \0。sscanf 或 strtok 分割,避免緩沖區殘留問題。// 安全讀取
scanf("%19s %10s %c", name, stunum, &sex); // 寬度 = 數組長度 - 1
// 或
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%19s %10s %c", name, stunum, &sex);
嚴格遵守「寬度 = 目標緩沖區大小 - 1」原則,杜絕緩沖區溢出。