You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何字符串中\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:27:36