C 与 2D 字符数组的串联



我正在逐行读取文本文件到2D数组中。我想连接字符数组,所以我有一个长字符数组。我对此有问题,我可以让它与两个字符数组一起工作,但是当我尝试做很多时,我出错了。

目前字符数组如下所示:

AGCTTTTCATTC

我想得到这样的东西:

AGCTTTTCATTCAGCTTTTCATTC

我已经包含了我的一些代码。

int counter = 0; 
fid = fopen("dna.fna","r");
while(fgets(line, sizeof(line), fid) != NULL && counter!=66283 ) {
    if (strlen(line)==70) {
        strcpy(dna[counter], line);        
    counter++;
    }
}
int dnaSize = 6628; 
//Concatenating the DNA into a single char array.
int i;
char DNA[dnaSize];
for(i = 0; i<66283;i++){
   strcpy(DNA[i],dna[i]);
   strcat(DNA[i+1],dna[i+1]);
}

你只需要循环最多< counter那么,您是在复制还是连接?你只需要做一个或另一个。

我建议在循环中使用strcat,但初始化DNA。

char DNA[dnaSize] = ""; //initalise so safe to pass to strcat
for(i = 0; i<counter;i++)
{
   strcat(DNA,dna[i]); //no need for indexer to DNA
}

此外,您还需要考虑两个数组的大小。我相信(希望)dnachar数组的数组。如果是这样,我想单单在第一维度上就66283长了。因此,即使每行长度为 1 个字符,它也不适合DNA6628长)。

以下是有关如何分配正确内存量的想法:

#define MAXLINELENGTH (70)
#define MAXDNALINES (66283)
//don't copy this line, it will not work because of the sizes involved (over 4MB)
//it will likely stack overflow
//just do what you are currently doing as long as it's a 2-d array.
char dna[MAXDNALINES][MAXLINELENGTH + 1];
int counter = 0; 
int totalSize = 0;
fid = fopen("dna.fna","r");
while(fgets(line, sizeof(line), fid) != NULL && counter!=MAXDNALINES ) {
    const int lineLength = strlen(line);
    if (lineLength==MAXLINELENGTH) {
        strcpy(dna[counter], line);        
        counter++;
        totalSize += lineLength;
    }
}
//Concatenating the DNA into a single char array (of exactly the right length)
int i;
char *DNA = malloc(totalSize+1); // the + 1 is for the final null, and putting on heap so don't SO
DNA[0] = ''; //the initial null is so that the first strcat works
for(i = 0; i<counter;i++){
   strcat(DNA,dna[i]);
}
//do work with DNA here
//finally free it  
free(DNA);

最新更新