2016-05-19 10 views
3

私は過去2日間奇妙な問題に遭遇しましたが、まだ解決できません。私は2つのテキストファイルから単語を取得し、それらの単語をツリーに追加しようとしています。私が言葉を得るために選ぶ方法はここで審問されます: Splitting a text file into words in CテキストファイルからC言語のツリーに単語を挿入

私は木に言葉を挿入するために使用する機能は以下の通りです:

void InsertWord(typosWords Words, char * w) 
{ 
    int error ; 
    DataType x ; 
    x.word = w ; 
    printf(" Trying to insert word : %s \n",x.word); 
    Tree_Insert(&(Words->WordsRoot),x, &error) ; 
    if (error) 
    { 
     printf("Error Occured \n"); 
    } 
} 

私は、ツリーにテキストファイルから単語をインポートしようとしていたときに、投稿リンクで述べたように「エラーが発生しました」。


テキストファイル:

AAAH

aaahh


char this_word[15]; 
while (fscanf(wordlist, "%14s", this_word) == 1) 
{ 
    printf("Latest word that was read: '%s'\n", this_word); 
    InsertWord(W,this_word); 
} 

富栄再び機能するために次のように正確に同じ単語を挿入しているときはうまく動作します。ツリーの機能を証明する

for (i = 0 ; i <=2 ; i++) 
    { 
    if (i==0) 
     InsertWord(W,"a"); 
    if (i==1) 
     InsertWord(W,"aaah"); 
    if (i==2) 
     InsertWord(W,"aaahh"); 
    } 

が正常に動作しますが、私はthen.Iがまっすぐ2日間デバッグしていますし、まだそれを理解することはできません何が起こっているかを理解することはできません。何か案は ?

+0

私は 'Tree_Insert()'のソースコードを見る必要があると思います。 –

答えて

1

あなたは常に文字列で同じメモリバッファを再利用している

char this_word[15]; 
while (fscanf(wordlist, "%14s", this_word) == 1) 
{ 
    printf("Latest word that was read: '%s'\n", this_word); 
    InsertWord(W,this_word); 
} 

を使って言葉を読んだとき。これは、実行時のことを意味します

x.word = w ; 

あなたはいつも同じアドレスを保存しています。そして、すべての読み取りは、すでに格納されているすべての単語を再定義します。基本的にデータ構造が壊れます。

char *this_word;に変更し、this_word = malloc(15)を配置してみてください。 whileループではなく、反復ごとに新しいバッファを割り当てます。だから見て

char *this_word; 
while (fscanf(wordlist, "%14s", this_word) == 1) 
{ 
    this_word = malloc(15); 
    printf("Latest word that was read: '%s'\n", this_word); 
    InsertWord(W,this_word); 
} 

Michael Walzの提案によれば、strdup(3)も直ちに問題を解決します。

もちろん、ツリーを終えたら、.wordの要素を解放することもできます。

+1

文字列が固定サイズのバッファ 'this_word'に読み込まれ、' InsertWord'で['strdup'](http://linux.die.net/man/3/strdup)を次のように使用する方が良いでしょう: 'x.word = strdup(w)'; –

+0

答えをありがとう、私はちょうどこれを試してみましょう!最高になることを願っています。 –

+1

どこを変更する必要がありますか?私はしばらくの間、同じ問題を抱えていました –

1

問題のような文字列の割り当てにあったようです.Strdupは問題を解決するようだ!

関連する問題