C语言解析比赛结果字节序列时char指针遇0值异常卡住问题
问题根因
- 核心错误是使用仅适用于标准C字符串的
strdup函数处理包含'\0'的二进制字节序列:C标准字符串函数遇到'\0'就会终止处理,当你把某队得分设为0时,这个0值在内存中就是'\0',strdup(results)只会复制从起始地址到第一个'\0'(也就是得分0的位置)的内容,后面的所有比赛数据都没有被复制到gres指向的内存中。 - 你调用
nameCopy(ptr + 2, ';')时,传入的地址已经超出了strdup分配的内存范围,属于越界访问,拿到的内存内容不确定,大概率第一个字节就是'\0',所以nameCopy返回空字符串,就出现了你看到的输出结果。
修复方案
- 替换
strdup为手动内存分配+memcpy,复制完整的二进制字节序列,不要依赖字符串函数处理含0的二进制数据:
把char *gres = strdup(results);替换为:
int total_len = 63; // 你已知的字节序列总长度 char *gres = malloc(total_len); memcpy(gres, results, total_len);
- 可选优化:避免重复调用
strlen计算队名长度,你可以改造nameCopy函数同时返回队名长度,减少字符串遍历次数,该优化不影响功能仅提升性能。 - 若需要读取多条比赛结果,每次读取完单条结果后,按规则计算偏移跳过分号即可读取下一条:单条结果的总长度是
strlen(res.team1) + 1(分隔空格) + 2(两个得分字段) + 1(分隔空格) + strlen(res.team2) + 1(分号/结束符),跳过分号后的地址就是下一条结果的起始地址。
内容的提问来源于stack exchange,提问作者liz
相关产品推荐
相关产品推荐

