2013-01-10 35 views
28

我正在做一些C疑難問題。在大多數情況下,我能夠找到正確的答案,但在那個問題上我遇到了問題。我知道使用編譯器的正確答案,但我不知道原因。strlen - 字符串的長度有時會增加1

看一看代碼:

char c[] = "abc\012\0x34"; 

會是什麼strlen(c)回報,使用標準的C編譯器?

我的編譯器返回4當我的預期是3

我的想法是strlen()將搜索NULL字符的第一次出現,但不知何故,結果是一個超過我的預期。

任何想法爲什麼?

+0

'NULL'是(擴展爲)*空指針常量*的宏。使用它來引用空字符「'\ 0」可能會令人困惑。 –

+0

繼續Keith的評論,'\ 0''這個詞是'NUL'(只有一個L)。 – Shahbaz

回答

58

讓我們寫

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' })。

+4

我相信你可以在剩下的七萬名代表中找到一些安慰。 – cmh

+1

@effeffe,這有可能最終成爲金票獎章。這足夠好嗎? – chris

+1

@chris它確實看起來像它可以讓我銀,但黃金會令人尷尬。 –