为何字符串中\0后接数字时,sizeof与strlen结果异常?
C语言字符串中转义字符的解析规则问题解答
这是因为C语言对八进制转义字符的解析规则导致的,具体拆解如下:
核心规则
C语言中,以反斜杠\开头的转义序列里,如果\后紧跟1-3个八进制数字(0-7),会被整体解析为一个八进制转义字符,对应ASCII表中该数值的字符。而单独的\0是八进制转义字符的特例,代表ASCII码为0的空字符(字符串结束标记)。
两个示例的具体解析
示例1:"S\0C5AB"
这里\0之后的字符是字母C,不属于八进制数字(0-7),因此\0被单独解析为空字符。字符串实际包含的字符序列是:'S' + '\0' + 'C' + '5' + 'A' + 'B' + '\0'(末尾的\0是字符串常量自动添加的结束符)
sizeof(s)统计的是整个数组的字节数,包括所有字符和末尾的结束符,因此是7;strlen(s)会在遇到第一个\0时停止计数,结果为1;printf输出到第一个\0就终止,所以只打印"S"。
示例2:"S\065AB"
这里\0之后紧跟了6和5,都是合法的八进制数字,因此编译器会把\065整体解析为一个八进制转义字符。八进制065转换成十进制是53,对应ASCII表中的字符'5'。字符串实际的字符序列是:'S' + '5' + 'A' + 'B' + '\0'(末尾自动添加的结束符)
sizeof(s)统计数组字节数,结果为5;strlen(s)遍历到末尾的\0才停止,结果为4;printf输出整个字符串,所以打印"S5AB"。
内容的提问来源于stack exchange,提问作者TheScore
相关产品推荐
相关产品推荐

