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

C 語言結構體輸入錯誤:字符數組與單字符混淆導致掃描失敗

     編輯:程式設計疑難解答

錯誤現象

用戶定義結構體:

struct Student {
    char name;      // 錯誤:單字符
    char age;
    char sex;
};

輸入時 scanf("%s", &st.name) 導致緩衝區溢出、程序卡死或崩潰。

根因分析

定義類型scanf 格式說明
char name[10]字符數組 (字符串)%s (讀至空白)需分配足夠空間含結束符 \0
char name單字符%c (讀單字符含空格)無法存儲名字
char *name指針需先 malloc動態分配

正確結構體定義

struct Student {
    char name[20];  // 字符數組,最長 19 字符 + \0
    int age;        // 年齡用 int,%d
    char sex;       // 性別單字符 'M'/'F',%c
};

安全輸入代碼

struct Student st;
printf("輸入姓名 年齡 性別: ");
// %19s 防止溢出,%c 前加空格跳過換行/空格
if (scanf("%19s %d %c", st.name, &st.age, &st.sex) != 3) {
    printf("輸入格式錯誤\n");
    return 1;
}
printf("錄入: %s, %d, %c\n", st.name, st.age, st.sex);

常見陷阱總結

  • %s 讀字符串:遇空白停止,自動加 \0,**目標必須是字符數組**,且指定寬度 %19s 防溢出。
  • %c 讀字符:不跳過空白**,讀取下一個字符(含空格/換行)。讀非空白字符前**必須加空格** " %c"。
  • 結構體對齊:char name[20]; int age; 中間可能有 3 字節填充,sizeof(Student) 可能為 28 而非 24,不影響邏輯但影響二進制寫入。
  • gets 已棄用:嚴禁使用,無邊界檢查,改用 fgets 或 scanf("%19s")。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved