0

私のプログラムは、引数で指定されたファイルを読み取り、ファイル内の各文字列とその頻度を出力します。

プログラムはこのファイルに対して機能します:http ://www.cse.yorku.ca/course/3221/dataset1.txtが、このファイルに対しては機能し ません:http ://www.cse.yorku.ca/course/3221/dataset2.txt 。

Segmentation fault (core dumped)2番目のファイルにエラーが発生します。

何が間違っている可能性がありますか?助けてください!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


typedef  struct {
    char  word[101];
    int   freq;
} WordArray;


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


    WordArray *array = malloc(sizeof(WordArray));
    FILE *file;

    int i = 0;
    file = fopen(argv[1], "r");
    char *str = (char*) malloc (108);

    while(fgets(str, 100, file) != NULL)
    {
        int pos = 0;
        char *word = malloc (100);

        while (sscanf(str, "%s%n", word, &pos ) == 1)
        {
            int j;
            for (j = 0; j < i; j++)
            {
                if (strcmp(array[j].word, word) == 0)
                {
                    array[j].freq = array[j].freq + 1;
                    break;
                }
            }
            if (j==i)
            {
                array = (WordArray *) realloc (array, sizeof(WordArray) * (i+1));
                strcpy(array[i].word, word);
                array[i].freq = 1;
                i++;
            }

            str += pos;

        }
    }

    fclose(file);

    int k;

    for (k=0; k<i; k++)
    {
        printf("%s %d\n", array[k].word, array[k].freq);
    }

    return 0;
}
4

1 に答える 1

2

いくつかの問題:

2番目のループの一部としてstrをインクリメントし、リセットしません。これは、あなたのプログラムがゆっくりと記憶を歩んでいることを意味していると思います。

単語を解放することに失敗します-おそらくループの外とスタックにそれを割り当てる方が良いでしょうが、入力が巨大でメモリが不足しない限り、クラッシュは発生しません。

最新のコンパイラでは、mallocの結果をキャストする必要はありません(はい、以前は必要でした)。

安全のためにmallocとreallocの結果を確認したい場合があります。

最初の項目はあなたの問題だと思います。

于 2013-01-26T01:49:15.970 に答える