我的程序读取参数中指定的文件,并在文件中打印出每个字符串及其频率。
该程序适用于此文件: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;
}
答案 0 :(得分:2)
几个问题:
将str作为第二个循环的一部分递增,不要重置它。我认为这意味着你的程序正慢慢地通过记忆。
你无法释放单词 - 可能最好将它分配到循环外和堆栈上,但这不会导致崩溃,除非你输入很大并且内存不足。
您不需要为现代编译器强制转换malloc的结果(是的,曾经需要它)。
可能需要检查malloc和realloc的结果是否安全。
我认为第一项是你的问题。