0

ファイルを読み取ってから、アルファベット順に並べ替えられた配列でファイルに書き込むとします。ただし、gdb を使用してセグメンテーション違反が発生し続けており、表示機能と並べ替え機能でセグメンテーション違反が発生していることを示しています。

EDIT:マクロを使用してメモリを割り当てることで修正しました。譲渡ですので、念のため公開したくありません。私のコードに関する皆さんの助けに感謝します。

4

1 に答える 1

1

あなたはこれをすることになっていますか?ああ。

私もセグメンテーション違反を起こしましたが、read_names() で発生しました。すべての strtok() を単純な scanf() に置き換えることで修正できました。

    void read_names (FILE *fp, char **f, char **l, char *m, int num)//read it
    {
        int i=0;
        char temp[80];

        for (i=0; i<num; i++)
        { 
            fscanf( fp, "%s %s %s", f[i], l[i], m);
        }
    } 

その後、最後に誤って何かを free() しようとしていますが、ソートして印刷することができました。

私は一般的に strtok() は安全ではなく、ただの苦痛です-それはあなたの文字列を破壊します.

また、より意味のある名前を使用すると、作業が容易になります。最終的に、「l[]」は姓を含む文字列の配列であることがわかりましたが、「sLastName[]」の行に沿った何かがそれを非常に高速化したでしょう。

編集:

入力テキスト ファイルを次のように収集しました。

2 bill smith a doug adams r

EDIT2:

OK、別のセグメンテーション違反が見つかりました。「ナンバー」とは?ファイル内の名前の数と各名前のサイズのようなものとして解釈されるようです?

// allocate "num" first name elements -> implied "num" is # of names
f=(char**)malloc (num*sizeof(char*));

// allocate space for each name... but uses the value of "num" for each name
for (i=0; i<num;i++)
    f[i]=(char*)malloc (num*sizeof(char));  // "num" bytes per name?

「num」の値ではなく、名前ごとに 100 バイトの割り当てを開始すると、2 番目の、そして私にとっては最後の segfault がなくなりました。

プログラム全体を入力してからテストを開始しましたか? 小さなステップで動作させてから、機能を段階的に追加する方がはるかに簡単です-各ステップで必要なことが実行されていることをデバッガーおよび/または printf() で確認します。

于 2012-11-14T00:24:07.660 に答える