C語言字符集深度解析:三字母詞、轉義序列與跨平台差異
三字母詞
早期為解決鍵盤/字符集缺少特定字符 (如 []{}|^#\~) 而設計,由 ?? 開頭的三字符序列表示:
| 三字母詞 | 代表字符 |
??( | [ |
??) | ] |
??! | | |
??< | { |
??> | } |
??' | ^ |
??= | # |
??/ | \ |
??- | ~ |
現狀:現代編譯器 (GCC 4.4+、MSVC、Clang) 默認禁用三字母詞 (需 -trigraphs 啟用),因其極易導致誤觸發 (如 "What??!" 變 "What|")。
轉義序列完整表
可見字符轉義
| 序列 | 含義 | 用途 |
\? | 問號 | 防止連續 ??? 被誤識為三字母詞 |
\" | 雙引號 | 字符串字面量內包含雙引號 |
\' | 單引號 | 字符常量內包含單引號 '\'' |
\\ | 反斜槓 | 字符串/字符常量內表示單個反斜槓 |
不可見控制字符
| 序列 | 名稱 | ASCII 碼 | 效果 |
\a | 響鈴 | 0x07 | 終端發出聲響/視覺提示 |
\b | 退格 | 0x08 | 光標左移一格 (不刪除字符) |
\f | 換頁 | 0x0C | 打印機換頁/終端清屏 |
\n | 換行 | 0x0A | 光標移至下行行首 (Unix 行尾標誌) |
\r | 回車 | 0x0D | 光標移至本行行首 (Mac OS 9 前行尾標誌) |
\t | 水平制表 | 0x09 | 光標跳至下一制表位 (通常 8 的倍數列) |
\v | 垂直制表 | 0x0B | 打印機垂直跳頁/終端少用 |
數值轉義
\ddd:1~3 位八進制數 (如 \101 = 'A')。
\xhh:1~2 位十六進制數 (如 \x41 = 'A')。注意:\x 後盡可能多讀取十六進制數字,建議用 "" 分隔:"\x41""BC" 避免歧義。
跨平台關鍵差異
| 特性 | Linux/Unix/macOS | Windows |
| 文本文件行尾 | \n (LF, 0x0A) | \r\n (CRLF, 0x0D 0x0A) |
| C 標準庫處理 | 無轉換 | 文本模式 fopen(..., "r") 讀取時自動將 \r\n → \n,寫入時 \n → \r\n |
\n 輸出效果 | 換行並歸位 | 僅換行 (需 \r\n 才換行歸位),控制台常自動處理 |
| 三字母詞默認 | GCC 4.4+ 禁用 | MSVC 禁用 |
實戰建議
- 文件處理:跨平台文本文件統一用
\n,二進制模式 "rb"/"wb" 禁用轉換。
- 網絡協議:HTTP 頭部強制
\r\n,發送前手動拼接。
- 字符串拼接:
"Path: " __FILE__ "\n" 利用編譯器相鄰字符串字面量自動連接特性。
- 避免在代碼中硬編碼路徑分隔符,用宏或運行時檢測:
#ifdef _WIN32 #define SEP '\\' #else #define SEP '/' #endif。