2011-01-16 7 views
0

私はリンクリストを作成しました。その要素は、前後の項目のアドレスを保持します。入力ファイルからコマンドを取得します。コマンドを検出し、次の文をパラメータとして使用します。 (テキスト:add_to_front john - >意味:add_to_front(john)リンクリストでCで入力を読み取る

コード:http://pastebin.com/KcAm1y3L

私はそれが何度も私に同じ出力を与える入力ファイルからコマンドを与えることを試みます。しかし、私が手動でmain()に入力を書き込むと、それは動作します。元の入力ファイルの場合

add_to_front john 
add_to_back jane 
add_to_back jane 
print 

(残念ながら)出力は次のようになります。

:私は

add_to_front(john); 
add_to_back(jane); 
add_to_back(jane); 
print(); 

を書く場合は代わりに、このコマンドのチェックの、けれども

>add_to_front john 
>add_to_back jane 
>add_to_back jane 
>print 
jane 
jane 
jane 

while (scanf("%s",command)!=EOF) 
{ 
    if (strcmp(command,"add_to_front")==0) 
    { 
     gets(parameter); 
     add_to_front(parameter); 
    } 
    else if (strcmp(command,"add_to_back")==0) 
    { 
     gets(parameter); 
     add_to_back(parameter); 
    } 
    else if (strcmp(command,"remove_from_back")==0) 
     remove_from_back(parameter); 
    ... 
     printf(" HUH?\n"); 
    } 
} 

main()では、正しい出力が得られます。

私はそれがたくさんあることを知っていますが、このことは2日間私を悩ましています。私は間違っていると思いますか?

+3

テストコードでも 'gets()'を使わないでください! **決して 'gets()'を使用しないでください! –

+0

デバッグ(デバッガを使用)...! – Drakosha

答えて

2

上記の関連コードは表示されません。ほとんどの場合、あなたのリストに読み込まれたデータはコピーされないので、最後に読み取った値を何度も何度も繰り返して保存することになります。


ペーストビンのコードを見ると、それは本当に問題です。文字列をリストにコピーしないでください。ポインタをコピーするだけです。文字列のスペースを割り当て、文字列をコピーするコードを追加する必要があります。利用可能な場合は、機能strdup()がきちんと動作します。そうでなければ、自分で簡単に書くことができます。これは割り当てられたスペースも解放する必要があることを意味します。

+1

@gcx:データのコピーを修正した後でも、残っている作業がいくつかあります。チェックフロント/バック機能は同じタグを持っていますが、チェックフロントはバックからプリントし、フロントからプリントをチェックバックします。私は妥当な見た目の 'd_free()'を実装しましたが、十分な追加、解放、および印刷を行うと、物事が依然としてねじれています。あなたは 'baslangic'が必要であるかどうか、なぜそれが必要なのかを見なければなりません。起動時に初期化されるダミーノードを持つ循環的な二重リンクリストを維持する方が良いかもしれません。 –

関連する問題