分段错误错误

时间:2013-01-26 01:25:11

标签: c

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

该程序适用于此文件: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;
}

1 个答案:

答案 0 :(得分:2)

几个问题:

将str作为第二个循环的一部分递增,不要重置它。我认为这意味着你的程序正慢慢地通过记忆。

你无法释放单词 - 可能最好将它分配到循环外和堆栈上,但这不会导致崩溃,除非你输入很大并且内存不足。

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

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

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