0

我的程序读取参数中指定的文件并打印出文件中的每个字符串及其频率。

该程序适用于此文件:http ://www.cse.yorku.ca/course/3221/dataset1.txt 但不适用于此文件: http ://www.cse.yorku.ca/course/3221/dataset2.txt .

它给出Segmentation fault (core dumped)了第二个文件的错误。

有什么问题?请帮忙!

#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

几个问题:

您增加 str 作为第二个循环的一部分,不要重置它。我认为这意味着您的程序正在慢慢地遍历内存。

您无法释放单词-最好将其分配在循环之外和堆栈上,但这不会导致崩溃,除非您输入的内容很大并且内存不足。

您不需要为现代编译器转换 malloc 的结果(是的,它曾经是必需的)。

可能要检查 malloc 和 realloc 的结果是否安全。

我认为第一项是您的问题。

于 2013-01-26T01:49:15.970 回答