注册 登录
编程论坛 C++教室

C语言编写,统计文件中的单词出现频率,结果是逐个输出单词,并输出这个单词的出现频率。求改错。

fl8962 发布于 2014-01-25 04:35, 1138 次点击
#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 编辑 ]
9 回复
#2
zklhp2014-01-25 10:32
这不就是C语言么
#3
fl89622014-01-25 14:51
回复 2楼 zklhp
对啊,我是求改错啊,我说了是用c语言编写
#4
wp2319572014-01-25 18:53
SF 貌似是格式错误  而不是答案错误
#5
zklhp2014-01-25 19:23
以下是引用fl8962在2014-1-25 14:51:54的发言:

对啊,我是求改错啊,我说了是用c语言编写

都发错版了。。
#6
蚕头燕尾2014-01-25 21:45
话说你想要输出的结果是什么样的?

从你的提问揣测,难道这段代码不是你写的?

#7
fl89622014-01-26 17:41
回复 6楼 蚕头燕尾
代码是我自己写的,输出文件中的每一个不重复单词,并且还输出每个单词出现的频率。文件名在运行程序的时候一起在终端输入,比如./count text.txt   回车
#8
fl89622014-01-26 17:43
回复 3楼 fl8962
求大侠详细指点。
#9
fl89622014-01-26 17:47
回复 5楼 zklhp
我知道这是c++版块,我一直用c++做练习,但是这个学期刚开c语言课,我按照我课后题改的一个题目。真心请您们指点一下我是哪里错了。
#10
TonyDeng2014-01-29 17:02
這種一個main()包攬一切的代碼風格,C也不應學成這樣啊,真心的很難看,估計這是沒人願意幫你排查的原因吧。
1