我正在做一些 C 谜题。在大多数情况下,我能够找到正确的答案,但是我遇到了问题。我通过使用编译器知道正确的答案,但我不知道原因。
看一下代码:
char c[] = "abc\012\0x34";
strlen(c)
使用标准 C 编译器会返回什么?
当我预期的是 3 时,我的编译器返回 4。
我认为strlen()
会搜索第一次出现的NULL
字符,但不知何故,结果比我预期的要多。
知道为什么吗?
让我们写
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' }
),但十六进制转义序列的长度不受限制
hexadecimal-escape-sequence:
\x
hexadecimal-digit
hexadecimal-escape-sequence hexadecimal-digit
因此"\x123456789abcdef"
仅包含两个字符 ( { '\x123456789abcdef', '\0' }
)。