[英]strlen - the length of the string is sometimes increased by 1
我正在做一些C拼圖問題。 在大多數情況下,我能夠找到正確的答案,但有了這個問題,我就遇到了問題。 我通過使用編譯器知道正確的答案,但我不知道原因。
看看代碼:
char c[] = "abc\012\0x34";
strlen(c)
會使用標准C編譯器返回什么?
當我期望的是3時,我的編譯器返回4。
我認為是strlen()
將搜索第一次出現的NULL
字符,但不知何故結果是比我預期的多一個。
知道為什么嗎?
讓我們寫
char c[] = "abc\012\0x34";
單個字符:
char c[] = { 'a', 'b', 'c', '\012', '\0', 'x', '3', '4', '\0' };
您看到的第一個\\0
是八進制轉義序列\\012
的開頭,它延伸到以下八進制數字。
八進制轉義序列在標准(N1570草案)的6.4.4.4節中規定:
八進制轉義序列:
\\
octal-digit
\\
八位數八進制數字
\\
octal-digit八進制數字八進制數字
它們由反斜杠后跟一個,兩個或三個八進制數字組成。 在該節第7段中,給出了八進制和十六進制轉義序列的范圍:
7每個八進制或十六進制轉義序列是可以構成轉義序列的最長字符序列。
請注意,雖然八進制轉義序列的長度限制為最多三個八進制數字(因此"\\123456"
由五個字符組成, { '\\123', '4', '5', '6', '\\0' }
),十六進制轉義序列具有無限長度
十六進制轉義序列:
\\x
十六進制數字
十六進制轉義序列十六進制數字
因此"\\x123456789abcdef"
只包含兩個字符( { '\\x123456789abcdef', '\\0' }
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.