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

C语言解析比赛结果字节序列时char指针遇0值异常卡住问题

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:36:04