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

C语言使用\x00截断字符串时buf1的strlen长度为10的原因是什么

问题原因

核心原因是C语言中\x开头的十六进制转义序列采用贪婪匹配规则:编译器会尽可能多地读取\x后面连续的十六进制字符(0-9、a-f、A-F),直到遇到非十六进制字符为止,而非默认只匹配两位。

你在buf1的初始化字符串中写的\x00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA里,\x后面紧跟的00A都是合法的十六进制字符,所以编译器不会把它解析为你预期的「\x00空终止符 + 字符A」,而是将\x00A识别为一个完整的十六进制转义序列,对应的数值为0x00A(即十进制10,对应换行符\n),这就导致buf1的第10位(索引9)不是空终止符,空终止符的位置后移了1位,最终strlen(buf1)返回10。

对比之下buf2的初始化字符串中\x00后面紧跟的是双引号(不属于十六进制字符),所以编译器会正确识别\x00为空终止符,strlen(buf2)返回预期的9。

修正方法

如果你需要在空终止符后面拼接其他字符,需要将字符串拆分为两部分书写,让编译器明确识别\x00为单独的转义序列:

// 拆分后编译器会自动拼接两个相邻的字符串常量
char buf1[1024] = "771675175\x00" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

此时strlen(buf1)就会返回预期的9。

内容的提问来源于stack exchange,提问作者Alston

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:27:01