首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言結構體陣列指標賦值錯誤:char 陣列不可作左值、長度不足、成員誤用

     編輯:程式設計綜合問答

原始碼三大錯誤

  1. long char name[5]; — 語法錯誤:long 不能修飾 char。應為 char name[20]; (預留足夠空間存中文+結束符)。
  2. a.name = "張丹"; — 陣列不可作左值:name 是固定地址,不能直接指派字串常量。需用 strcpy(a.name, "張丹"); 或 scanf("%19s", a.name);。
  3. 成員誤寫: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; 只取值未賦值回 pp = p->next;
成員寫錯結構體複製貼上未修改變數前綴逐行核對、善用 IDE 重構/重命名

進階建議

  • 輸入中文建議用 fgets() 讀整行再去換行符,scanf("%s") 遇空白斷開。
  • 結構體設計可加入 float average; 欄位,避免額外陣列。
  • 動態配置記憶體 (malloc) 而非棧上變數,支援任意數量學生。

總結

C 語言結構體字串成員**只能用 strcpy/strncpy/scanf/fgets 寫入**,不能直接指派。陣列長度須預留結束符與多位元組字元空間。仔細核對變數名、指標移動賦值,是避免低級錯誤的關鍵習慣。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved