2017-11-05 13 views
1

私はC言語で新しいです。私は文字列の動的配列で遊びます。私は、テキストファイルからすべての単語を文字列の配列にロードしたい。私は動的に項目を配列に追加します。それはほとんど動作しますが、私がそれらをプリントアウトしたいときには、私は単語を繰り返しました。私は問題があると思うdictionary = (char **)realloc(dictionary, sizeof(char *) * (idx));配列は元のデータをコピーして1つ増やす必要があります。ポインタを使ったCの文字列の動的配列

int main() { 

    FILE *fr; 
    int i = 0; 
    int c; 
    const char *path = "..../sample.txt"; 
    char *word; 
    char **dictionary; 
    word = (char *)malloc(sizeof(char)); 
    dictionary = (char **)malloc(sizeof(char *)); 

    int idx = 0; // index of word 
    int widx = 0; // index of char in word 

    fr = fopen(path, "r"); 
    while((c = getc(fr)) != EOF){ 
     if(c == ' '){ 
      widx++; 
      word = (char *)realloc(word, sizeof(char) * (widx)); 
      *(word + widx-1) = '\0'; 
      idx++; 
      dictionary = (char **)realloc(dictionary, sizeof(char *) * (idx)); 
      *(dictionary+idx-1) = word; 
      widx = 0; 
      word = (char *)realloc(word, 0); 
     } 
     else if(c == '.' || c == ',' || c == '?' || c == '!'){ 
      // skip 
     } 
     else{ 
      widx++; 
      word = (char *)realloc(word, sizeof(char) * (widx)); 
      *(word + widx-1) = (char)c; 
     } 
    } 
    fclose(fr); 

    // print words 
    int n = idx; 
    for(i = 0; i < n; i++){ 
     printf("%d - %s \n", i, *(dictionary+i)); 
    } 
    return 0; 
} 

出力:期待

0 - shellbly 
1 - 
2 - shellbly 
3 - Bourne-derived 
4 - shellbly 
5 - Bourne-derived 
6 - shellbly 
7 - Bourne-derived 

は:

1 - The 
2 - original 
3 - Bourne 
4 - shell 
5 - distributed 
6 - with 
7 - V7 
8 - Unix 

私が何か間違ったことをしなければなりません。ご意見ありがとうございます。

+1

ターゲット言語がCの場合は、C++タグを追加しないでください。 CとC++は2つの非常に異なる言語です。 –

+0

'const char * path =" ..../sample.txt "; - それは何をすべきでしょうか? –

+0

* 1 *非常に明白な問題: 'widx ++'に続いて 'realloc(word、sizeof(char)*(widx))'の後に '*(word + widx-1)= '\ 0' '。あなたが最後の操作を行うとき、 'widx - 1'の値は何ですか? –

答えて

1

realloc(word, 0)は、free(word)に相当します。しかし、ポインタwordは、ちょうどdictionaryの要素として保存したポインタと同じです。つまり、ポインタ要素dictionaryにはアクセスできなくなりました。

word = realloc(word, 0);の代わりに、word = NULL;を使用できます。これにより、次にreallocに新しいストレージが割り当てられ、ポインタはdictionaryのままになります。

割り当てられたメモリを適切にクリーンアップすることに問題がある場合は、後でfreeすべての有効なポインタをdictionaryにします。

+0

ありがとうございます。今私はそれを見る、私は次の言葉のために同じバッファを再利用していた。もう一つの質問:辞書を整理したいときは、すべての単語に '' 'free(word)' 'を呼び出す必要があります。その後は' 'free(辞書)' 'を呼び出すことができます。右? –

関連する問題