文件操作与字符处理 不知道哪里出错了
在当前目录中存在文件名为"case1.in"(其中case后为数字1,不是字母l,写错提交后会判错)的文本文件,其内容为一篇英文文章(以EOF作为结束标志)。现要求读取该文本文件内容,统计文章中每个单词出现的次数,
并输出出现次数最多的前5个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,
不足5个单词时,按序输出全部单词)。程序中注意如下细节:
(1) 空格、标点符号与回车符起到分隔单词的作用。
(2) 文章一行的末尾可能有连字符,出现连字符时,该行最末的字符串与下行最先出现的字符串构一个单词;
(3) 名词缩写算一个单词;
(4) 数字不算单词;
(5) 单词不区分大小写;
(6) 输出时单词全使用小写;
#include"stdio.h"
#include"string.h"
#include"malloc.h"
#include"math.h"
#include"stdlib.h"
#include"ctype.h"
#define LEN sizeof(struct word)
struct word
{
char a[21];
int n;
struct word *next;
};
int k=0;
struct word *receive(FILE*fp)
{
int i=0;
struct word *p1,*p2,*head;
char b[21];
head=(struct word *)malloc(LEN);
p1=p2=head;
while((b[i]=fgetc(fp))!=EOF)
{
if(isalpha(b[i]))
{i++;}
else
{
if(i!=0)
{
b[i]='\0';
strlwr(b);
strcpy(p1->a,b);
p1=(struct word*)malloc(LEN);
p2->next=p1;
p2=p1;
i=0;
}
}
if(isalpha(b[i-1]))
{
b[i]='\0';
strlwr(b);
strcpy(p1->a,b);
}
}
p1->next=NULL;
return head;
}
void count(struct word *head)
{
struct word *P,*p1,*p2;
P=head;
while(P->next!=NULL)
{
P->n=1;
p1=P;
p2=P->next;
do
{
if(strcmp(P->a,p2->a)==0)
{
P->n++;
p1->next=p2->next;
p2->next=NULL;
p2=p1->next;
}
else
{
p1=p2;
p2=p2->next;
}
}while(P->next!=NULL);
P=P->next;
}
return;
}
void arrange(struct word *head)
{
struct word *p,*p1;
char t[21];
int i,j,T;
p=head;
while(p!=NULL)
{
k++;
p=p->next;
}
for(i=1;i<k;i++)
{
p=head;
p1=p->next;
for(j=1;j<k-i;j++)
{
if(p->n<p1->n)
{
T=p->n;
p->n=p1->n;
p1->n=T;
strcpy(t,p->a);
strcpy(p->a,p1->a);
strcpy(p1->next,t);
}
else
if(p->n==p1->n)
{
if(strcpy(p->a,p1->a)>0)
{
strcpy(t,p->a);
strcpy(p->a,p1->a);
strcpy(p1->a,t);
}
}
p=p->next;
p1=p1->next;
}
}
return ;
}
int main()
{
FILE *fp;
struct word *head,*p;
int i;
if((fp=fopen("case.txt","r"))==NULL)
return 0;
head=receive(fp);
count(head);
arrange(head);
k--;
if(k<5)
{
p=head;
while(p->next!=NULL)
{
printf("%s%7d\n",p->a,p->n);
p->next;
}
}
else
{
p=head;
for(i=0;i<5;i++)
{
printf("%s%7d\n",p->a,p->n);
p=p->next;
}
}
fclose(fp);
return 0;
}