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

如何将strtok从文件读取的token存入数组?输出仅最后一行如何解决

核心问题定位
  • 你存储到list数组里的不是字符串的实际内容,而是指向临时缓冲区dtm的指针。所有行分割得到的token指针都指向同一块dtm内存空间,每次读取新行时都会覆盖dtm里的旧内容,最终所有指针指向的都是最后一次写入的文件最后一行数据,所以遍历输出时全是最后一行的内容。
  • 额外注意:用feof统计行数的写法普遍存在逻辑漏洞。feof仅会在读取操作触发文件结束失败后才返回真,直接以!feof(fp)作为循环条件会多统计1次行数,建议改用fgets逐行读取、读取成功再计数的方式统计行数。
修复方案
  1. 分割得到token后不要直接赋值指针到list,先申请独立内存存储token内容
    示例代码片段:
// row为当前处理的行号,col为当前列号
char* token = strtok(dtm, "|");
int col = 0;
while (token != NULL) {
    // 申请对应长度的内存,多留1位存储字符串结束符'\0'
    list[row][col] = (char*)malloc(strlen(token) + 1);
    // 把token内容拷贝到新申请的独立内存中
    strcpy(list[row][col], token);
    col++;
    token = strtok(NULL, "|");
}
  1. 程序运行结束前,需要遍历list数组逐个调用free释放申请的内存,避免内存泄漏。
  2. 调整行数统计逻辑,示例如下:
int line_cnt = 0;
char buf[1024];
while (fgets(buf, sizeof(buf), fp) != NULL) {
    line_cnt++;
}
rewind(fp); // 回退文件指针

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:36:06