如何将strtok从文件读取的token存入数组?输出仅最后一行如何解决
核心问题定位
- 你存储到
list数组里的不是字符串的实际内容,而是指向临时缓冲区dtm的指针。所有行分割得到的token指针都指向同一块dtm内存空间,每次读取新行时都会覆盖dtm里的旧内容,最终所有指针指向的都是最后一次写入的文件最后一行数据,所以遍历输出时全是最后一行的内容。 - 额外注意:用
feof统计行数的写法普遍存在逻辑漏洞。feof仅会在读取操作触发文件结束失败后才返回真,直接以!feof(fp)作为循环条件会多统计1次行数,建议改用fgets逐行读取、读取成功再计数的方式统计行数。
修复方案
- 分割得到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, "|"); }
- 程序运行结束前,需要遍历
list数组逐个调用free释放申请的内存,避免内存泄漏。 - 调整行数统计逻辑,示例如下:
int line_cnt = 0; char buf[1024]; while (fgets(buf, sizeof(buf), fp) != NULL) { line_cnt++; } rewind(fp); // 回退文件指针
内容的提问来源于stack exchange,提问作者Louis Chung
相关产品推荐
相关产品推荐

