2017-01-30 16 views
0

ファイルから文字列を読み込み、文字列配列にコピーしようとしています。 セグメンテーションフォールトを取得する前に、ファイルの最初の文字列だけを正しく読み込むことができない理由を理解できません。私は、ファイル内の各文字列が50文字までであることを知っています。ファイルから文字列を読み込んで配列にコピーする -

... 

int i = 0; 
char s[50]; 
int N=0; 
FILE *fp; 

//Figures out how many strings are stored in the file 
while(fgets(s, 50, fp)!=NULL){N++} 

rewind(fp); 

char *strings[N]; //This is the array where I want to store strings 

for(i=0;i<N;i++){ 

    fgets(s, 50, fp); 
    strcpy(strings[i], s); 
    printf("%s", s); 
} 

なぜ文字列を配列に正常に保存できないのですか?

+0

初期化されていないポインタでは 'strcpy'を使うことはできません。' strdup'を使う:strings [i] = strdup ; ' –

+1

ヒント:' char * strings [N] 'はN個のポインタの配列ですが、どれも初期化されていません。各ポインタは、未定義のメモリ位置を指し示します。 –

+0

@MichaelWalz:ありがとう!だから私はstrcpyを使用することができますが、私は各 'strings [i]'ポインタを初期化する必要があります。 fgets()の後に、 'strings [i] =(char *)malloc(50 * sizeof(char));'のようなものを使うべきだと思いますか? – davideAlbertini

答えて

0

次の2つのミスをしている:文字列をコピーするときに、宛先が文字列である場合inyour

1-、あなたは、先にメモリを割り当てる必要が[i]は、あなたは、任意のメモリ

が割り当てられていないいます

2 - あなたの文字列がnullでなければなりません。このコードは動作するはずです

を終了:あなたはベクトルを使用していない場合は、あなたが持っていることを

#define MAX_STRINGS 100 
    int i = 0; 
    char s[50]; 
    int N=0; 
    while(fgets(s, 50, fp)!=NULL){N++;} 
    char strings[MAX_STRINGS][50]; 

    rewind(fp); 
    for(i=0;i<N && i<MAX_STRINGS;i++){ 

     fgets(s, 50, fp); 
     strcpy(strings[i], s); 
     printf("%s", s); 
    } 

注意を配列のサイズを事前に定義するには、基本的に配列のサイズは定数でなければなりません

関連する問題