使用strsep读取CSV文件出现段错误,仅能输出首行无法处理后续内容
段错误产生原因
核心问题来自strsep函数的特性:strsep会直接修改传入的第一个参数(字符串指针的地址)指向的指针值,每切分出一个token,指针就会向后移动到下一个待切分的位置,当整段字符串切分完成后,指针会被置为NULL。
你的代码中直接把原缓冲区指针str的地址传入strsep,第一行内容切分完成后,str已经被修改为NULL。下一轮循环调用fgets(str, 10240, fp)时,第一个参数传入了空指针,触发非法内存访问,直接产生段错误。另外代码中你申请的tmp副本完全没有被实际用于切分,还产生了内存泄漏。
修复方案
修改切分逻辑,使用临时副本做切分,不修改原缓冲区指针str的指向,保证下一轮fgets可以正常写入缓冲区,同时记得释放临时副本避免内存泄漏。
修复后可正常运行的代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ FILE *fp = fopen("users100.csv", "r"); if(!fp){ printf("Erro"); return 0; } char *str = (char *) malloc(10240); if (!str) { printf("malloc failed"); fclose(fp); return 0; } while(fgets(str, 10240, fp) != NULL){ char *tmp = strdup(str); char *token; char *tmp_start = tmp; // 保存临时副本的起始地址,避免strsep修改tmp后无法正常释放 while((token = strsep(&tmp, ";")) != NULL){ printf("%s ", token); } putchar('\n'); free(tmp_start); // 释放strdup申请的内存 } free(str); fclose(fp); return 0; }
内容的提问来源于stack exchange,提问作者Hugo Novais
相关产品推荐
相关产品推荐

