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

C语言读取逗号分隔字符串存入数组时异常拆分问题求助

问题分析:逗号分隔字符串读取时的异常拆分问题

嘿,我看了你的代码和遇到的问题,这个异常拆分的根源其实很明确——你的line数组长度不够,导致fgets没法一次性读取整行内容。

问题原因拆解

你定义的char line[300];,但你的文件是一整行包含30个逗号分隔的字符串,我们粗略计算下这行的总长度:

  • 每个字符串大概是30个字符(比如第10个字符串10AAAAAAAAAAAAAAAAAAAAAAAAAAAA是2位数字+28个A,共30字符)
  • 30个字符串加上30个逗号(最后还有一个结尾逗号),总长度大概是 30*30 + 30 = 930 字符

这个长度远超你设置的line数组大小300,所以fgets每次只能读取300个字符就停止,把一整行内容拆成了多次读取。比如第一次读到第10个字符串的中间位置时就截断了,strtok会把这个截断的片段当成一个独立的token存入数组;下一次fgets读取剩余内容时,又会把第10个字符串的剩下部分当成新的token,这就造成了你看到的“字符串被拆分”的现象。

解决方案

只需要调整line的长度,确保它能容纳整行的所有内容,同时可以加个小优化防止数组越界:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (){
 int N = 300;
 int L = 1000;
 char Nseq[N][L];
 FILE *myfile;
 char *token;
 const char s[2] = ",";
 // 增大line数组长度,确保能容纳整行
 char line[2048];
 char* filename = "pathtofile.txt";
 int n = 0;
 myfile = fopen(filename, "r");
 if (myfile == NULL) {printf("could not open file %s", filename); exit(0);}
 while (fgets(line, sizeof(line), myfile) != NULL){
  token = strtok(line, s);
  while (token != NULL){
    // 增加数组越界检查,避免溢出
    if(n >= N) {
        printf("Warning: 超过数组上限,停止读取\n");
        break;
    }
   strcpy(Nseq[n], token);
   printf("%s\t%u\n", token, n);
   token = strtok(NULL, s);
   n++;
  }
 }
 fclose(myfile);
}

这样修改后,fgets就能一次性读取整行内容,strtok就可以正确拆分出每个完整的字符串了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:07:31