2012-02-21 5 views
1

私はcで新しく、このバグに何時間も立ち往生しています。私のコードは、txtファイルから各単語を読み込み、その単語をトライのノードに格納します。fscanfは何らかの形でノードを変更しています(C言語)

私はアスタリスクで区切られた領域に絞り込んだ: その時点で、最初の単語をトライに追加して、正しいノードの値がその単語と一致することを確認した。次に、fscanfを使用して、ファイルの次の単語をchar 'add'として保存します。それで、以前とまったく同じことを印刷して、ノードの単語は同じままでなければなりません。しかし、それは何とかファイルから読み込まれたばかりの新しい単語に変更されています。

これはどのように可能ですか?

int main(int argc, char** argv) { 

trie_t* trie = malloc(sizeof(trie_t)); 
trie_init(trie); 

int ret; 
char* add = malloc(128); 
FILE* file = fopen(argv[5], "r"); 
if (file == NULL) { 
    /* Failed to open the file for reading */ 
    return 0; 
} 

while (1) {********************* 
    if (trie->head->children != NULL) { 
     printf("%s\n", trie->head->children->word); 
    } 
    ret = fscanf(file, "%s", add); 
    //printf("word = %s\n",toAdd); 
    if (trie->head->children != NULL) { 
     printf("%s\n", trie->head->children->word); 
    }**************************** 
    if (ret == EOF) { 
     /* End of file */ 
     ret = 1; 
     break; 
    } else if (ret <= 0) { 
     printf("fails"); 
     /* Failed to read a word from the file */ 
     break; 
    } else { 
     printf("gets here\n"); 
     /* Succesfully read a word */ 
     int x = trie_add(trie, add); 
     printf("%d\n",x); 
    } 
} 

答えて

1

私はあなたがtrie_add機能でtrie_tにポインタaddを格納していると仮定します。この場合、同じメモリ位置addを次の文字列の読み込みに再利用するため、addが指すポインタの内容が変更されます。 trieにこのポインタを格納しているだけなので、そのノードの内容もこのために変更されます。これを解決するには、fscanfを使用してファイルから新しい文字列を読み込む直前にmallocを使用してメモリを再度割り当てる必要があります。あなただけでaddに一度のメモリを割り当てている

2

char* add = malloc(128); 

あなたは、あなたのリードサイクルへmallocを移動する必要がある、つまり、単語ごとにメモリを割り当てる必要があります。

あなたが投稿したときのコードは次のとおりです。128バイトを1回割り当ててから、scanf()ごとにそのメモリスペースを何度も上書きします。それが働いていた。また

char* add = malloc(128);であなただけの明確な、移植をchar* add = malloc(128 * sizeof(char));としてそれを割り当てる必要があります:)

+0

!ありがとう! – user1222613

+2

私は 'malloc()'呼び出しで 'sizeof'の使用を推奨している最中ですが、' sizeof(char) 'は1であることに注意してください。すべてのプラットフォームで。だから、ここでは物事を改善するためにそれほど大したことはありません。 'char * add = malloc(128 * sizeof * add);'を使用すると、わかりやすく型の独立性を持たせることができます。 – unwind

関連する問題