首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言字符與字符串完全指南:編碼、記憶體、指標、轉換函數大全

     編輯:關於C語言

字符 (`char`) 是 C 語言最基礎也最容易踩坑的類型。本文系統整理編碼知識、記憶體模型、指標與陣列差異、`const` 修飾規則、數值轉換函數,並附上完整可執行範例,助你建立清晰的字符串知識體系。

1. 編碼基礎

編碼特點中文字節數
ASCII7 位元,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("...") 宏自動切換寬窄字面值。

2. 字符串結尾 `\0` 鐵律

  • 雙引號字面值 "abc" 編譯器自動補 `\0` → 佔 4 位元組。
  • 單引號字符 'a' 不補 `\0`,本質是整數 (ASCII 碼 97)。
  • 所有標準庫字符串函數 (`strlen`, `strcpy`, `printf("%s")`) 皆依賴 `\0` 判斷結尾。

3. 單引號 vs 雙引號:值與指標的本質差異

char ch = 'A';      // 整數 65,佔 1 位元組
char *str = "abcd"; // 指向常量區 "abcd\0" 首地址,str 可修改指向,但 *str 唯讀

字面值字符串存放於**常量區** (唯讀),相同內容可能合併優化。

4. 字符陣列 `char[]`:擁有所有權的可讀寫緩衝區

char str[5] = "abcd"; // 在棧上分配 5 位元組,複製 "abcd\0" 進去
str[0] = 'e';         // 合法,修改內容
// str = "efg";      // 錯誤:陣列名是常量指標,不可改變指向

修改整個字符串請用 strcpy(str, "efg") 或 strncpy。

5. `const char *` vs `char *const` 徹底搞懂

宣告含義可修改指向?可修改內容?
const char *p / char const *p指向常量的指標是否
char *const p常量指標 (指向固定)否是 (若指向非 const)
const char *const p指向常量的常量指標否否

應用:malloc 回傳指標若不想被改動指向,宣告為 char *const p = malloc(n);。

6. 字符/字符串與數值互轉函數大全

字符串 → 數值

  • atoi / atol / atoll (C99) / _atoi64 (MS) – 整數
  • atof – double
  • strtol/strtoul/strtod – **推薦**,支援錯誤檢測、進制、尾指標。

數值 → 字符串

  • sprintf(buf, "%d", val) – 通用格式化,緩衝區溢位風險。
  • snprintf(buf, n, "%d", val) – **安全版**,限制長度。
  • itoa/_itoa/_i64toa (MS) – 指定進制 (2, 8, 10, 16)。
  • 寬字符版:swprintf, _itow 等。

格式化掃描 `sscanf` 進階模式

sscanf("abchhdad 123 oofg", "%[a-z] %[1]", str1, str2);
// str1="abchhdad" (貪婪匹配 a-z), str2="1" (匹配單一 '1')

掃描集 `%[...]`、`%[^...]` (排除集) 極強大,可替代簡單正則。

7. 完整範例程式

文中包含:手寫 StringInt 字符串轉整數 (支援負號)、標準庫函數對照驗證、`sprintf`/`sscanf` 綜合演示。代碼已整理可直接編譯運行。

掌握本文知識點,你將能自信處理 C 語言中所有字符、字符串、編碼、轉換相關問題,告別亂碼、緩衝區溢位、指標混淆等經典坑點。

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