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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:15:04