2

テキストファイルを1行ずつ2D配列に読み込んでいます。char配列を連結したいので、1つの長いchar配列があります。私はこれに問題があり、2つのchar配列で動作させることができますが、それらの多くを実行しようとするとうまくいきません。

現在、char配列は次のようになっています。

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]);
}
4

1 に答える 1

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
}

また、2 つの配列のサイズを考慮する必要があります。dna私はそれがの配列の配列であると信じています(願っています)char。だとしたら66283一次元だけで長いかな。そのため、各行の長さが 1 文字だったとしても、DNA( long)には収まりません。6628

正確に適切な量のメモリを割り当てる方法のアイデアを次に示します。

#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] = '\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);
于 2012-12-09T01:51:05.190 に答える