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

C语言如何在自定义函数中读取分号分隔CSV数据存入三个数组

C语言读取分号分隔CSV并存入多数组实现方案

以下是可直接运行的修改后代码,适配你的需求:

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

// 配置项:最大支持读取100条数据,单条名字/姓氏最大长度32字节
#define MAX_COUNT 100
#define NAME_LEN 32

// 函数声明:返回值为实际读取到的有效数据条数,读取失败返回-1
int load_values(char name[][NAME_LEN], char surname[][NAME_LEN], int birth[]);

int main()
{
    // 二维字符数组存储多个名字、姓氏
    char name[MAX_COUNT][NAME_LEN] = {0};
    char surname[MAX_COUNT][NAME_LEN] = {0};
    int birth[MAX_COUNT] = {0};
    int valid_count = 0;

    valid_count = load_values(name, surname, birth);
    if (valid_count < 0) {
        printf("文件打开失败,请确认list_of_values.csv存在\n");
        return 1;
    }

    // 按要求格式输出结果
    printf("name[");
    for (int i = 0; i < valid_count; i++) {
        printf("%s%s", i > 0 ? "," : "", name[i]);
    }
    printf("]\n");

    printf("surname[");
    for (int i = 0; i < valid_count; i++) {
        printf("%s%s", i > 0 ? "," : "", surname[i]);
    }
    printf("]\n");

    printf("birth[");
    for (int i = 0; i < valid_count; i++) {
        printf("%s%d", i > 0 ? "," : "", birth[i]);
    }
    printf("]\n");

    return 0;
}

int load_values(char name[][NAME_LEN], char surname[][NAME_LEN], int birth[])
{
    FILE *data = fopen("list_of_values.csv", "r");
    if (data == NULL) return -1;

    int idx = 0;
    char full_name[NAME_LEN * 2] = {0};
    int year;

    // 按分号分隔规则读取每行,%[^;]匹配到分号前的所有内容
    while (idx < MAX_COUNT && fscanf(data, "%[^;];%d\n", full_name, &year) == 2) {
        // 按第一个空格拆分名字和姓氏
        char *space_p = strchr(full_name, ' ');
        if (space_p != NULL) {
            strncpy(name[idx], full_name, space_p - full_name);
            name[idx][space_p - full_name] = '\0';
            strcpy(surname[idx], space_p + 1);
        }
        birth[idx] = year;
        idx++;
    }

    fclose(data);
    return idx;
}

核心修改说明

  • 修正数组定义:将原一维的name/surname改为二维字符数组,支持存储多条字符串数据
  • 适配分号分隔规则:用fscanf的%[^;]格式符直接匹配分号前的完整姓名,无需逐字符遍历文件
  • 兼容特殊姓名格式:通过strchr匹配第一个空格拆分姓名,支持名字带连字符等特殊字符的场景
  • 补全异常处理:增加文件打开失败判断、数组越界防护,读取完成后主动关闭文件
  • 调整函数逻辑:数组传参为地址传递,函数内直接修改主函数中定义的数组即可,无需返回数组,返回值改为有效数据条数方便后续遍历

运行后输出和你要求的预期效果完全一致:

name[Tom,Joh-Bob,Evan]
surname[Brombadil,Larson,Thompson]
birth[1997,1999,1899]

内容的提问来源于stack exchange,提问作者D. K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:06:04