strlen - 字符串的长度有时会增加1

时间:2013-01-10 18:08:24

标签: c string strlen

我正在做一些C拼图问题。在大多数情况下,我能够找到正确的答案,但有了这个问题,我就遇到了问题。我使用编译器知道正确的答案,但我不知道原因。

看看代码:

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

使用标准C编译器会strlen(c)返回什么?

我的编译器返回4时,我的预期是3.

我认为strlen()会搜索NULL字符的第一个匹配项,但结果却比我预期的要多一些。

知道为什么吗?

1 个答案:

答案 0 :(得分:60)

让我们写一下

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

单个字符:

char c[] = { 'a', 'b', 'c', '\012', '\0', 'x', '3', '4', '\0' };

您看到的第一个\0是八进制转义序列\012的开头,它延伸到以下八进制数字。

八进制转义序列在标准(N1570草案)的6.4.4.4节中规定:

  

八进制转义序列:
     \ 八位数
     \ 八进制数字八进制数
     \ 八进制数字八进制数字八进制数字

它们由反斜杠后跟一个,两个或三个八进制数字组成。在该节的第7段中,给出了八进制和十六进制转义序列的范围:

  

7每个八进制或十六进制转义序列是最长的字符序列   构成逃脱序列。

请注意,虽然八进制转义序列的长度限制为最多三个八进制数字(因此"\123456"由五个字符{ '\123', '4', '5', '6', '\0' }组成),十六进制转义序列具有无限长度

  

十六进制转义序列:
      \x 十六进制数字
      十六进制 - 转义 - 序列十六进制数字

因此"\x123456789abcdef"只包含两个字符({ '\x123456789abcdef', '\0' })。