long char name[5]; — 語法錯誤:long 不能修飾 char。應為 char name[20]; (預留足夠空間存中文+結束符)。a.name = "張丹"; — 陣列不可作左值:name 是固定地址,不能直接指派字串常量。需用 strcpy(a.name, "張丹"); 或 scanf("%19s", a.name);。b.mun=...; a.name=...; b.score[0]=...; a.score[1]=... — **複製貼上未改變數名**,導致資料寫錯結構體。#include <stdio.h>
#include <string.h>
#define MAX_NAME 20
struct Student {
int num;
char name[MAX_NAME];
int score[3];
struct Student *next;
};
int main() {
struct Student a, b, c, *head, *p;
// 正確賦值
a.num = 10101;
strcpy(a.name, "張丹");
a.score[0] = 89; a.score[1] = 95; a.score[2] = 91;
b.num = 10103;
strcpy(b.name, "彭浩");
b.score[0] = 99; b.score[1] = 89; b.score[2] = 90;
c.num = 10105;
strcpy(c.name, "張磊");
c.score[0] = 85; c.score[1] = 95; c.score[2] = 97;
// 建立鏈表
head = &a;
a.next = &b;
b.next = &c;
c.next = NULL;
// 遍歷輸出 (修正 p->next 未賦值回 p 的錯誤)
p = head;
while (p != NULL) {
printf("%d %s %d %d %d\n", p->num, p->name, p->score[0], p->score[1], p->score[2]);
p = p->next; // 關鍵:移動指標
}
return 0;
}
| 錯誤現象 | 原因 | 正確做法 |
|---|---|---|
left operand must be l-value | 陣列名稱是常量地址,不可賦值 | 用 strcpy() 複製內容,或 scanf() 直接讀入 |
| 中文亂碼/截斷 | char name[5] 太短,UTF-8 一個中文 3 字節 | 至少 char name[20] 或改用 wchar_t/std::string (C++) |
| 遍歷無限迴圈 | p->next; 只取值未賦值回 p | p = p->next; |
| 成員寫錯結構體 | 複製貼上未修改變數前綴 | 逐行核對、善用 IDE 重構/重命名 |
fgets() 讀整行再去換行符,scanf("%s") 遇空白斷開。float average; 欄位,避免額外陣列。malloc) 而非棧上變數,支援任意數量學生。C 語言結構體字串成員**只能用 strcpy/strncpy/scanf/fgets 寫入**,不能直接指派。陣列長度須預留結束符與多位元組字元空間。仔細核對變數名、指標移動賦值,是避免低級錯誤的關鍵習慣。