2011-06-13 96 views
4
char p[]="abc\012\0x34"; 
printf("%d\n",strlen(p)); 

我得到输出4.不应该是3 ??? 虽然下面我得到3包含 0的字符串长度

char p[]="abc\0"; 
printf("%d\n",strlen(p)); 

回答

12

你的字符串确实包含四个大字\0之前,即abc\012

后者是一个有效的八进制转义序列,它是十进制的10,即ASCII换行字符。

\0x34另一方面是无效八进制 - 只有\0部分是有效的,因此这是NUL终止字符串的真正结束。

4

\012是一个八进制转义字符,而不是一个NUL其次12x终止第二个八进制字符,因此它真的是NUL。 (\x34将是一个十六进制转义字符正确的形式。)

一个NUL字符作为\0的表示是一个八进制的转义序列的一种特殊情况。通常,\后面可以跟一个,两个或三个八进制数字,以形成字符或字符串文字中的有效八进制转义序列。

1

\012是单个字符。之后停止在\0之后(并且"x34"是另外三个字符,不包括NUL终止符)。

0

\012是八进制值(“\ n”)。

4

你的字符串具有长度4:

您代码等价于:。 炭P [] = { 'A', 'B' 'C' '\ 012', '\ 0',” X”, '3', '4', '\ 0'};

\ 012 - 在八进制数字系统中代码为12的字符(= 10中的十进制='\ n')