現象複現
#include <stdio.h>
int main() {
printf("(Welcome??)"); // ?? 觸發三字母詞
return 0;
}
// 輸出:(Welcome] (因 ??) 被替換為 ])
三字母詞對照表 (ISO 646)
| 三字母詞 | 替換為 |
??( | [ |
??) | ] |
??< | { |
??> | } |
??= | # |
??/ | \ |
??' | ^ |
??- | ~ |
??! | | |
正確輸出 ?? 的方法
方法一:在每個 ? 前加反斜槓 (推薦)
printf("(Welcome\\?\\?)"); // 輸出:(Welcome??)
\? 是標準轉義序列,專門用於阻止三字母詞識別。
方法二:雙重轉義 (輸出字面 \?)
printf("(Welcome\\\\?\\\\?)"); // 輸出:(Welcome\\?\\?)
適用場景
- 字串常數中出現連續多個
? (如 ???、??!??!)。
- 正則表達式、URL 查詢字串、使用者輸入回顯等。
現代編譯器行為
- GCC/Clang 預設**關閉**三字母詞 (需
-trigraphs 開啟)。
- MSVC 預設關閉。
- 嚴格遵循 C89/C99 的舊編譯器可能預設開啟。
- **最佳實踐**:無論編譯器預設如何,見到
?? 就寫 \\?,保證可移植性。
- 上一篇文章: C語言轉義字元陷阱:路徑字串與 strlen 計算
- 下一篇文章: C語言計算階乘:for 循環與 while 循環兩種實現對比
Copyright ©
程式碼之家 All Rights Reserved