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
相关产品推荐
相关产品推荐

