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.
相关产品推荐
相关产品推荐

