C 語言轉義字符是新手必考、必會、必錯的知識點。本文以一道經典面試題為切入點,徹底講透 \0、\ddd 八進制轉義、字符串結束標記的交互邏輯。
int main() {
int a = 1;
printf("ab\0efg\n");
printf("ab\060efg");
return 0;
}
printf("ab\0efg\n");\0 是空字符,ASCII 碼 0,同時也是 C 語言字符串的結束標記。printf 遇到 \0 即停止輸出,後續 efg\n 在內存中存在但不被打印。ab(無換行,因 \n 被截斷)。printf("ab\060efg");\060 是八進制轉義:060₈ = 6×8¹ + 0×8⁰ = 48₁₀。'0'(數字零)。printf 繼續輸出後續 efg。ab0efg。abab0efg
(第一句 ab 緊接第二句 ab0efg,中間無換行)
| 轉義形式 | 含義 | 示例 | 結果 |
|---|---|---|---|
\0 | 空字符(NUL),字符串結束符 | "A\0B" | 只輸出 A |
\ddd | 1-3 位八進制數(0-377) | \101 (65) → A | 對應 ASCII 字符 |
\xhh | 十六進制數 | \x41 → A | 對應 ASCII 字符 |
\n | 換行符 (LF, ASCII 10) | "A\nB" | 換行輸出 |
\60 等同 \060,但建議補齊 3 位避免歧義(如 \060 vs \60 後跟數字)。strlen("ab\0efg") == 2,sizeof("ab\0efg") == 7(含結束符)。strlen/strcpy/printf),需用 memcpy/write + 顯式長度。\x30 代替 \060,可讀性更強。// 輸出什麼?
printf("A\0B\063C\x44");
// 答案:A (遇 \0 結束) -> 輸出 "A"
printf("A\063B"); // \063 = 51 = '3' -> 輸出 "A3B"
printf("A\x30B"); // \x30 = 48 = '0' -> 輸出 "A0B"
掌握「\0 截斷輸出、\ddd 八進制轉字符」兩大規則,C 語言轉義字符題穩拿滿分。