字串本質
字串 = char 陣列 + 結尾 '\0' (NUL 字元)。
五種定義方式
| 方式 | 代碼 | 特性 |
| 字串常數 | "hello" | 靜態儲存區,唯讀,同內容共用 |
| 陣列初始化 | char s[] = "hello"; | 編譯器算大小,堆疊/資料段,可修改 |
| 指定大小陣列 | char s[20] = "hello"; | 固定緩衝區,防溢位 |
| 指標指向常數 | const char *p = "hello"; | 指向唯讀區,指標可改、內容不可改 |
| 指標陣列 | char *a[] = {"s1","s2"}; | 每元素指向字串常數,適合字串集合 |
字串輸入函式
| 函式 | 行為 | 安全性 |
gets(s) | 讀整行至換行,不檢查長度 | ❌ 已棄用,極危險 |
fgets(s, n, stdin) | 最多 n-1 字元,保留換行 | ✅ 推薦 |
scanf("%s", s) | 讀單詞 (跳過空白,遇空白停) | ⚠️ 需配合寬度 %19s |
字串輸出函式
| 函式 | 特性 |
puts(s) | 自動換行 |
fputs(s, stdout) | 不換行,可導向檔案 |
printf("%s", s) | 格式化彈性大 |
char *p vs char s[] 關鍵差異
| 操作 | char s[] | char *p |
| 修改內容 | ✅ | ❌ (指向常數區) |
指標運算 ++p | ❌ (陣列名非左值) | ✅ |
sizeof | 陣列總大小 | 指標大小 (4/8) |
二維指標陣列 vs 指向二維陣列指標
char *msg[3] = {"a", "b", "c"}; // msg: 3 元素指標陣列
char (*pmsg)[3] = &msg; // pmsg: 指向 3 元素指標陣列的指標
msg[i] → 第 i 個字串位址。
*msg[i] / msg[i][0] → 第 i 字串首字元。
總結
掌握字串「NUL 結尾」本質、五種定義選擇標準、fgets 安全輸入、char*/char[] 差異、指標陣列管理字串集合,即能輕鬆駕馭 C 語言字串處理各種場景。
- 上一篇文章: 演算法圖解:直接插入排序法原理、過程演示與 Java 實作代碼
- 下一篇文章: C 語言指標核心觀念與實戰:記憶體模型、指標運算、函數傳遞、多級指標、野指標防禦
Copyright ©
程式碼之家 All Rights Reserved