| 轉義序列 | 含義 | ASCII 碼 | 常用場景 |
\n | 換行 | 10 (0x0A) | 行結束 |
\t | 水平製表 | 9 (0x09) | 對齊輸出 |
\b | 退格 | 8 (0x08) | 覆蓋前一字符 |
\r | 回車 | 13 (0x0D) | 行首覆蓋、進度條 |
\f | 換頁 | 12 (0x0C) | 打印機控制 |
\\ | 反斜線 \ | 92 (0x5C) | 路徑、正則 |
\' | 單引號 ' | 39 (0x27) | 字符常量中 |
\" | 雙引號 " | 34 (0x22) | 字符串中 |
\a | 響鈴 | 7 (0x07) | 警報 |
\ddd | 1-3位八進制 | 對應值 | \101='A' |
\xhh | 1-2位十六進制 | 對應值 | \x41='A' |
\0 | 空字符 | 0 (0x00) | 字符串結束標誌 |
廣義轉義:任意字符均可用 \ddd/\xhh 表示
\101 = 'A' (65=101₈)
\x41 = 'A' (65=41₁₆)
\134 = '\\' (92=134₈)
範例:轉義字符實戰
- printf("ab c\tde\rf\n"); // \t跳格,\r回車覆蓋,\n換行
- printf("hijk\tL\bM\n"); // \t跳格,\b退格覆蓋 L 為 M
字符變量
聲明與存儲
char a, b; // 1 字節
signed char c; // 明確有符號 (-128~127)
unsigned char d; // 明確無符號 (0~255)
- 每個 char 佔 1 字節 (8 位)
- 存儲內容:字符的 ASCII 碼值 (0-127) 或擴展字符集值
char 是否有符號:實現定義 (x86 通常有符號,ARM 通常無符號)
內存存儲模型圖解

字符 'x' (ASCII 120) 存儲為:01111000
字符 'y' (ASCII 121) 存儲為:01111001
字符與整數互轉:C 語言的靈活性核心
核心規則
- 字符參與運算 → 自動提升為 int (ASCII 值)
- 整數賦給字符 → 取低 8 位
- 輸出格式決定解讀:
%c 顯字符,%d 顯 ASCII 碼
範例 3-9:整數賦給字符變量
- char a, b;
- a = 120; b = 121;
- printf("%c,%c\n", a, b); // x,y
- printf("%d,%d\n", a, b); // 120,121
範例 3-10:字符參與運算實現大小寫轉換
- char a = 'a', b = 'b';
- a = a - 32; // 'a'(97) - 32 = 65 = 'A'
- b = b - 32; // 'b'(98) - 32 = 66 = 'B'
- printf("%c,%c\n%d,%d\n", a, b, a, b);
原理:ASCII 碼中大小寫字母相差 32 (0x20),第 5 位不同。
字符串常量
定義與存儲結構
- 雙引號括起:
"CHINA", "C program"
- 內存佔用:字符數 + 1 (結束符
\0)
- 類型:
const char[] (不可修改,存儲在只讀區)
內存佈局圖解

"C program" 佔 10 字節:
'C' ' ' 'p' 'r' 'o' 'g' 'r' 'a' 'm' '\0'
67 32 112 114 111 103 114 97 109 0
字符常量 vs 字符串常量:關鍵差異
| 特性 | 字符常量 'a' | 字符串常量 "a" |
| 引號 | 單引號 | 雙引號 |
| 字符數 | 1 | 1 (但含隱藏 \0) |
| 內存佔用 | 1 字節 (實為 int 類型) | 2 字節 |
| 類型 | int | const char[2] |
| 可修改性 | 非左值 | 不可修改 (只讀區) |
| 賦給字符變量 | char c = 'a'; ✅ | char c = "a"; ❌ 類型不匹配 |
內存圖解對比

'a':[97] (1 字節,實際表達式類型為 int)

"a":[97][0] (2 字節,含結束符)
C 語言無字符串變量:用字符數組模擬
- 無內建
string 類型 (C++ 有 std::string)
- 用
char str[N] 存儲字符串
strcpy, strcat, strlen 等庫函數操作
- 必須手動管理緩衝區大小、結束符、防溢出
⚠️ 經典陷阱與避坑指南
🚫 陷阱 1:字符常量類型是 int,非 char
sizeof('a') == sizeof(int) // 通常 4,非 1
// 影響可變參數函數
printf("%c", 'a'); // 'a' 提升為 int 傳遞,%c 期望 int (提升後) ✅
🚫 陷阱 2:字符串常量不可修改
char *p = "Hello";
p[0] = 'h'; // ❌ 未定義行為!字符串常量在只讀區
// 正確
char arr[] = "Hello"; // 復制到棧上可修改
arr[0] = 'h'; // ✅
🚫 陷阱 3:字符數組缺少結束符
char str[5] = {'H','e','l','l','o'}; // 無 \0
printf("%s", str); // ❌ 越界讀取,直到遇到隨機 \0
// 正確
char str[] = "Hello"; // 自動含 \0
🚫 陷阱 4:getchar/scanf 讀字符的空白字符問題
char c;
scanf("%c", &c); // 讀取空格/換行
// 正確
scanf(" %c", &c); // 格式串前加空格跳過空白
🚫 陷阱 5:char 有符號性導致的比較錯誤
char c = 200; // 有符號 char 時溢出為 -56
if (c > 100) ... // ❌ -56 > 100 為假
// 正確
unsigned char c = 200; // 明確無符號
if (c > 100) ... // ✅
最佳實踐清單
- 明確字符類型有符號性:用
signed char/unsigned char 而非裸 char 做數值
- 字符串常量用
const char*:const char *msg = "Hello";
- 可修改字符串用字符數組:
char buf[100] = "Hello";
- 字符輸入用
scanf(" %c", &c):跳過空白
- 大小寫轉換用標準庫:
toupper(), tolower() (<ctype.h>) 而非手動 ±32
- 字符分類用
isalpha(), isdigit() 等:本地化感知
- 避免直接操作字符串常量
總結
C 語言字符類型體系的核心洞見:
- 字符即小整數:
char 本質是 1 字節整數,ASCII 碼賦予語義
- 字符常量類型為 int:歷史遺留,影響 sizeof 和可變參數
- 字符串 = 字符數組 + \0 結束符:無內建字符串類型
- 轉義序列統一控制字符表示:\n, \t, \xhh, \ddd
- 字符與整數自由互轉:取決於上下文和格式符 (%c vs %d)
掌握這些機制,配合 <ctype.h> 標準庫函數,能安全、高效、可移植地處理文本數據。
- 上一篇文章: C語言變量初始化:定義時賦初值的語法、規則與陷阱
- 下一篇文章: C語言浮點類型完整指南:浮點常量、變量、精度、存儲格式與捨入誤差
Copyright ©
程式碼之家 All Rights Reserved