C语言编写,统计文件中的单词出现频率,结果是逐个输出单词,并输出这个单词的出现频率。求改错。
#include<stdio.h>#include<stdlib.h>
#include<string.h>
#define Max_word_number 10000000
#define Max_word 100
struct Word //结构体中包括单词,还有这个单词在文件中出现的频率和次数
{
float frequency;
char word[100];
int frequenct;
};
int main(int argc, char *argv[])
{
FILE *p;
if(argc<2)
{
printf(" can not open this file.\n");
exit(0);
}
else
{ char *filename;
filename=argv[1];
p=fopen(filename,"r");
}
struct Word WORD[Max_word_number];
char words[Max_word_number][Max_word]; //这个数组用来存储文件中出现的单词,但是不包括重复的
char awords[Max_word_number][100]; //这个数组用来存储文件中的所有单词,包括重复出现的
char word[Max_word]; //存储每个单词
char op;
int i=0,j=0,t=0,sum=0,k=0;//SUM 是用来统计总共的单词数(包括重复), K 是不包括重复的单词数。
op=fgetc(p);
while(op!=EOF)
{
if(isalpha(op))
word[i++]=op; //遇到字母就把字母存储到word数组中
else
{ word[i]='\0';//如果遇到的不是字母,结束这个数组
if(i!=0)
{ sum++;//单词的总个数,包括重复的
strcpy(awords[t++],word);//将这个单词拷贝到二维数组awords中
for(i=0;i<Max_word_number;++i)
{
if(strcmp(word,words[i])==0) //这个for循环判断这个单词在不在已经输入的单词中
{ j=1;
break;
}
}
if(j!=1)//如果这个单词没有出现过,就将这个单词拷贝到二维数组words中。
{
strcpy(words[k],word);
k++;
}
}
i=0;//将I 的值重新赋为0,继续while循环的计算。
}
}
for(i=0;i<k;i++)
{
strcpy(WORD[i].word,words[i]);//将没有重复出现的单词逐个拷贝到结构体数组中
}
for(i=0;i<sum;i++)
{
for(j=0;i<k;j++)
{
if(strcmp(WORD[j].word,awords[i])==0)//计算结构体中单词在文件中出现的次数
WORD[j].frequenct++;
}
}
for(i=0;i<k;++i)
{
WORD[j].frequency=WORD[j].frequenct/sum;//用得到的次数计算频率
}
for(i=0;i<k;++i)//输出每个单词和这个单词对应的频率
{
printf("%s \n",WORD[i].word);
printf("%f \n",WORD[i].frequency);
}
return 0;
}
结果是 Segmentation fault
[ 本帖最后由 fl8962 于 2014-1-25 04:40 编辑 ]