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

C语言CSV文件解析求助:将数据存入二维数组,strtok使用出错

Hey there! 作为C语言新手碰到CSV解析的问题太正常啦,我来帮你把strtok的用法掰明白,顺便给你一套完整的代码,搞定解析+存数组+算列平均的需求~

正确用strtok解析CSV行并存入二维数组

首先得先避开strtok的几个坑,不然很容易出问题:

  • strtok会修改原始字符串:它会把分隔符(这里是逗号)替换成\0,所以如果之后还要用原行内容,得先复制一份
  • 调用规则:第一次传要解析的字符串,后续每次传NULL,直到返回NULL就表示这行解析完了
  • 注意:如果你的CSV里有带逗号的引号字段(比如"张三,李四",25这种),strtok就搞不定了,得写更复杂的逻辑,但先假设你是简单的无引号CSV~

完整代码示例

假设你已知CSV有ROWS行、COLS列,直接看代码(我加了详细注释):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 替换成你实际的行数和列数
#define ROWS 10  
#define COLS 3   

int main() {
    // 初始化二维数组存储数值
    float data[ROWS][COLS] = {0.0};
    FILE *fp = fopen("your_file.csv", "r");
    
    // 检查文件是否打开成功
    if (!fp) {
        perror("打开文件失败");
        return 1;
    }

    char line[256];  // 假设每行最长不超过256个字符,可按需调整
    int row_idx = 0;

    // 逐行读取CSV内容
    while (fgets(line, sizeof(line), fp) != NULL && row_idx < ROWS) {
        // 去掉行尾的换行符(fgets会把换行符也读进来)
        line[strcspn(line, "\n")] = '\0';

        // 开始解析第一个字段
        char *token = strtok(line, ",");
        int col_idx = 0;

        // 循环解析每行的所有字段
        while (token != NULL && col_idx < COLS) {
            // 把字符串转成float存入二维数组
            data[row_idx][col_idx] = atof(token);
            col_idx++;
            // 继续解析下一个字段
            token = strtok(NULL, ",");
        }
        row_idx++;
    }
    fclose(fp);

    // 计算并打印每列的平均值
    printf("各列平均值:\n");
    for (int col = 0; col < COLS; col++) {
        float sum = 0.0;
        for (int row = 0; row < ROWS; row++) {
            sum += data[row][col];
        }
        float avg = sum / ROWS;
        printf("第%d列:%.2f\n", col + 1, avg);
    }

    return 0;
}

关键细节说明

  • 去掉换行符:用strcspn快速定位换行符的位置,替换成\0,避免最后一个字段带换行导致转数值出错
  • 数组越界防护:循环里加了row_idx < ROWS和col_idx < COLS,防止数组越界崩溃
  • 数值转换:用atof把字符串转成浮点数,如果你的数据是整数,换成atoi就行
  • 空字段处理:如果CSV里有空字段(比如,123,),atof会返回0.0,要是需要特殊处理,可以加判断(比如检查token是否为空字符串)

进阶注意事项

如果你的CSV有带引号的复杂字段,比如"Apple, Inc.",100,200,strtok会把"Apple和 Inc."当成两个字段,这时候就得自己写解析逻辑:遍历字符串,遇到引号就跳过里面的逗号,直到遇到闭合引号再继续分隔。不过如果是新手项目,大概率是简单CSV,上面的代码足够用啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:36:50