在当前目录中存在文件名为"case1.in"(其中case后为数字1,不是字母l,写错提交后会判错)的文本文件,
其内容为一篇英文文章(以EOF作为结束标志)。现要求读取该文本文件内容,统计文章中每个单词出现的次数,
并输出出现次数最多的前5个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,
不足5个单词时,按序输出全部单词)。程序中注意如下细节:
(1) 空格、标点符号与回车符起到分隔单词的作用。
(2) 文章一行的末尾可能有连字符,出现连字符时,该行最末的字符串与下行最先出现的字符串构一个单词;
(3) 名词缩写算一个单词;
(4) 数字不算单词;
(5) 单词不区分大小写;
(6) 输出时单词全使用小写;
```c
#include "stdio.h"
#include "math.h"
#include "string.h"
#include "stdlib.h"
struct wordstore
{
char c[21];
int num; //重复次数
} word[10000];
main()
{
FILE*fp=fopen("case1.in","r"); //以下操作是把文件中的所有单词存进结构体数组里
if(fp==NULL)
{
perror("fopen");
return 0;
}
char ch,w[21]; //w用来储存取出的一个单词
int i=0,flag=0; //i是表示存入一个单词时的下标
int k=0; //从文件中取出单词的数量
int j=0; //用于遍历文件取出的单词下标
while((ch=fgetc(fp))!=EOF)
{
if(ch>='A'&&ch<='Z')
ch=ch+32;
if(ch>='a'&&ch<='z')
{
w[i++]=ch;
flag=1; //有单词
}
else //录入的不是单词
{
if(ch=='-'&&(ch=fgetc(fp))=='\n')
flag=0; //单词还没有结束
if(flag==1) //一个单词结束了
{
w[i]='\0';
for(j=0; j<k; j++) //取出的所有单词遍历
{
if(strcmp(w,word[j].c)==0) //有相同的单词
{
word[j].num++;
break;
}
}
//没有相同的即为新单词,个数置为1,把w储存的单词复制给结构体
if(j==k)
{
word[k].num=1;
strcpy(word[k++].c,w);
}
i=0;
}
}
}
//输出出现次数最多的5个单词
for(i=0; i<k-1; i++) //冒泡排序,使其降序排列
{
for(j=0; j<k-1-i; j++)
{
if(word[j+1].num-word[j].num>0)
{
char tmp[21];
strcpy(tmp,word[j].c);
strcpy(word[j].c,word[j+1].c);
strcpy(word[j+1].c,tmp);
}
else if(word[j+1].num==word[j].num) //假如出现次数相同,按字典顺序输出,即小的先输出
{
if(strcmp(word[j+1].c,word[j].c)<0)
{
char tmp[21];
strcpy(tmp,word[j].c);
strcpy(word[j].c,word[j+1].c);
strcpy(word[j+1].c,tmp);
}
}
}
}
for(i=0;i<5;i++)
{
printf("%s %d\n",word[i].c,word[i].num);
}
fclose(fp);
return 0;
}
```
I am a student. My school is SCAU. It is a beau-
tiful university. I like it.
正确输出应该如下:
a 2
i 2
is 2
it 2
am 1
为什么我的错误输出是:
i 2
a 1
am 2
1
student 3
怎么修改程序才能正确,我的错因在哪里?