2017-10-26 19 views
-1

strtok()を使用して文字列をトークン化し、そのトークンをfee(char * new_word)に送信して新しいノードに割り当てる必要がある関数foo 。これですべてうまくやっていますが、foo()とfee()が終わると、リンクされたリストを表示するbar()を実行する必要があり、ノードポインタのデータが壊れているとわかりますそれ。どのようにしてトークンを保持できますか?初期化関数の終了後のストロークトークンをCで終わらせる

struct node{ 
char *word; 
struct node *next; 
}; 

struct node top = NULL; 

void foo(){ 
char *str = "Some words go here"; 
char *token = NULL; 
token = strtok(str, "\n"); 
while (token){ 
    fee(token); 
    token = strtok(NULL, "\n"); 
} 
} 

void fee(char * new_word){ 
struct node *new_node = malloc(sizeof(struct node)); 
new_node->word = new_word; 
new_node->next = head; 
head = new_node; 
} 

bar(){ 
    while (top){ 
    printf("%s\n", top->word); 
    top = top->next; 
    } 
} 
int main(int argc, char *argv[]){ 
foo(); 
bar(); 
return 0; 
} 
+3

おそらくトークンのコピーが必要です。あなたの実際のコードを私たちに教えてください。 [mcve]を入力してください。 – BLUEPIXY

+0

**完全かつ検証可能な**には、実際にコンパイルされる有効なコードである必要があります。あなたの実際のコードを質問にコピーし、あなたの記憶からゆるやかに似たものを書き換えないでください。 'struct node top = NULL;'は何かエラーを出すはずです。 – Gerhardh

答えて

0

トークンは、元の文字列のメモリブロック内のメモリ位置をポイントします。元の文字列が解放されると、トークンはゴミを指し示します。トークンを保持したい場合は、元の文字列を解放したり、各トークンのコピーを作成する必要があります(strcpyまたはstrdup - 下記のコメントを参照)。

問題を引き起こしている行はnew_node->word = new_word;fee())です。トークンポインタを代入する代わりに、new_node->wordのメモリを割り当て、new_wordをコピーする必要があります。 fooが実行されると、文字列メモリブロックが解放されます。 barが実行されるまでに、あなたのトークンは割り当てられていないメモリを指しています。もしfoo()上記mainchar *str = "Some words go here";を初期化し、そして場合

あるいは、その後もstrために動作するstr(即ちfoo(str))は、スコープ内に残る渡します。あなたがこのルートに行くなら、あなたのプログラムがクラッシュするだけでnew_node->wordを解放しようとしないでください。

+1

またはstrdup。 'token = strtok(...);と言うのではなく、料金(トークン); 'それは' token = strtok(...);に変更することができます。料金(strdup(トークン)); ' –

関連する問題