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

