[英]strlen - the length of the string is sometimes increased by 1
我正在做一些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节中规定:
八进制转义序列:
\\
octal-digit
\\
八位数八进制数字
\\
octal-digit八进制数字八进制数字
它们由反斜杠后跟一个,两个或三个八进制数字组成。 在该节第7段中,给出了八进制和十六进制转义序列的范围:
7每个八进制或十六进制转义序列是可以构成转义序列的最长字符序列。
请注意,虽然八进制转义序列的长度限制为最多三个八进制数字(因此"\\123456"
由五个字符组成, { '\\123', '4', '5', '6', '\\0' }
),十六进制转义序列具有无限长度
十六进制转义序列:
\\x
十六进制数字
十六进制转义序列十六进制数字
因此"\\x123456789abcdef"
只包含两个字符( { '\\x123456789abcdef', '\\0' }
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.