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

Prz*_*m3k 28 c string strlen

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

看看代码:

char c[] = "abc\012\0x34";
Run Code Online (Sandbox Code Playgroud)

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

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

我的想法是strlen()搜索NULL角色的第一次出现,但不知何故结果是比我预期的更多.

知道为什么吗?

Dan*_*her 60

让我们写

char c[] = "abc\012\0x34";
Run Code Online (Sandbox Code Playgroud)

单个字符:

char c[] = { 'a', 'b', 'c', '\012', '\0', 'x', '3', '4', '\0' };
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

7每个八进制或十六进制转义序列是可以构成转义序列的最长字符序列.

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

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

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

  • 我相信你能在剩下的七万名代表中找到一些安慰. (4认同)
  • @GrijeshChauhan因为十六进制转义序列以`\ x`开头,而不是`\ 0x`,十六进制转义序列将是`'\ x34'.在`"...\0x34 ..."`中,`'\ 0'`是一个八进制转义序列,后跟三个普通字符''x',"3"和"4". .我不知道为什么十六进制转义序列开始`\ x`而不是`\ 0x`,我想如果在反斜杠之后立即确定转义序列的类型,则更容易解析. (2认同)