字符 (`char`) 是 C 語言最基礎也最容易踩坑的類型。本文系統整理編碼知識、記憶體模型、指標與陣列差異、`const` 修飾規則、數值轉換函數,並附上完整可執行範例,助你建立清晰的字符串知識體系。
| 編碼 | 特點 | 中文字節數 |
|---|---|---|
| ASCII | 7 位元,128 字符,英文專用 | 不支援 |
| ANSI (GB2312/BIG5/JIS) | 相容 ASCII,雙位元組編碼中文 | 2 |
| Unicode (UTF-16/UTF-32) | 萬國碼,固定/變長,跨平台 | 2 或 4 |
| UTF-8 | 變長 1-4 位元組,ASCII 兼容,網頁標準 | 3 |
C 語言中:char 存 ANSI/UTF-8;wchar_t 存寬字符 (UTF-16/UTF-32);_T("...") 宏自動切換寬窄字面值。
"abc" 編譯器自動補 `\0` → 佔 4 位元組。'a' 不補 `\0`,本質是整數 (ASCII 碼 97)。char ch = 'A'; // 整數 65,佔 1 位元組 char *str = "abcd"; // 指向常量區 "abcd\0" 首地址,str 可修改指向,但 *str 唯讀
字面值字符串存放於**常量區** (唯讀),相同內容可能合併優化。
char str[5] = "abcd"; // 在棧上分配 5 位元組,複製 "abcd\0" 進去 str[0] = 'e'; // 合法,修改內容 // str = "efg"; // 錯誤:陣列名是常量指標,不可改變指向
修改整個字符串請用 strcpy(str, "efg") 或 strncpy。
| 宣告 | 含義 | 可修改指向? | 可修改內容? |
|---|---|---|---|
const char *p / char const *p | 指向常量的指標 | 是 | 否 |
char *const p | 常量指標 (指向固定) | 否 | 是 (若指向非 const) |
const char *const p | 指向常量的常量指標 | 否 | 否 |
應用:malloc 回傳指標若不想被改動指向,宣告為 char *const p = malloc(n);。
atoi / atol / atoll (C99) / _atoi64 (MS) – 整數atof – doublestrtol/strtoul/strtod – **推薦**,支援錯誤檢測、進制、尾指標。sprintf(buf, "%d", val) – 通用格式化,緩衝區溢位風險。snprintf(buf, n, "%d", val) – **安全版**,限制長度。itoa/_itoa/_i64toa (MS) – 指定進制 (2, 8, 10, 16)。swprintf, _itow 等。sscanf("abchhdad 123 oofg", "%[a-z] %[1]", str1, str2);
// str1="abchhdad" (貪婪匹配 a-z), str2="1" (匹配單一 '1')
掃描集 `%[...]`、`%[^...]` (排除集) 極強大,可替代簡單正則。
文中包含:手寫 StringInt 字符串轉整數 (支援負號)、標準庫函數對照驗證、`sprintf`/`sscanf` 綜合演示。代碼已整理可直接編譯運行。
掌握本文知識點,你將能自信處理 C 語言中所有字符、字符串、編碼、轉換相關問題,告別亂碼、緩衝區溢位、指標混淆等經典坑點。