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