我正在做一些C疑難問題。在大多數情況下,我能夠找到正確的答案,但在那個問題上我遇到了問題。我知道使用編譯器的正確答案,但我不知道原因。strlen - 字符串的長度有時會增加1
看一看代碼:
char c[] = "abc\012\0x34";
會是什麼strlen(c)
回報,使用標準的C編譯器?
我的編譯器返回4當我的預期是3
我的想法是strlen()
將搜索NULL
字符的第一次出現,但不知何故,結果是一個超過我的預期。
任何想法爲什麼?
我正在做一些C疑難問題。在大多數情況下,我能夠找到正確的答案,但在那個問題上我遇到了問題。我知道使用編譯器的正確答案,但我不知道原因。strlen - 字符串的長度有時會增加1
看一看代碼:
char c[] = "abc\012\0x34";
會是什麼strlen(c)
回報,使用標準的C編譯器?
我的編譯器返回4當我的預期是3
我的想法是strlen()
將搜索NULL
字符的第一次出現,但不知何故,結果是一個超過我的預期。
任何想法爲什麼?
讓我們寫
char c[] = "abc\012\0x34";
與單個字符:
char c[] = { 'a', 'b', 'c', '\012', '\0', 'x', '3', '4', '\0' };
你看到的第一個\0
是延伸到下面的八進制數八進制轉義序列\012
的開始。
八路轉義序列在標準的6.4.4.4節(N1570草案)中指定:
八進制轉義序列:
\
八進制位
\
octal-十進制八進制數字
\
八進制八進制數字八進制數字
它們由一個反斜槓後跟一個,兩個或三個八進制數字組成。在該節第7段,八進制和十六進制轉義序列的程度給出:
7每個八進制或十六進制轉義序列是能夠 構成轉義序列字符的最長序列。
注意,儘管一個八進制轉義序列的長度被限制在至多三個八進制數(因此"\123456"
由五個字符,{ '\123', '4', '5', '6', '\0' }
),十六進制轉義序列具有無限長度
hexadecimal-逃生序列:
\x
十六進制數字
十六進制轉義序列十六進制數字
因此"\x123456789abcdef"
只包含兩個字符({ '\x123456789abcdef', '\0' }
)。
'NULL'是(擴展爲)*空指針常量*的宏。使用它來引用空字符「'\ 0」可能會令人困惑。 –
繼續Keith的評論,'\ 0''這個詞是'NUL'(只有一個L)。 – Shahbaz