C语言:从一个文件中读取英语单词,统计单词个数和每个单词出现的频率 代码哪里有问题,求大神帮忙修改下
代码如下:#include<stdio.h>#include<stdlib.h>#include<string.h>#defineM100#defineN20charte...
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 100
#define N 20
char temp[100];
char str[M][N]; //单词字串结果存放数组
int strcount[M]; //单词字串计数数组.对应每个单词串,拥有一个计算器
int i=0,j=0,k=0,t=0,x=0;
void main()
{
FILE *fp;
int count=0;
if((fp=fopen("data.txt","r"))==NULL)
{
printf("无法打开该文件!\n");
exit(0);
}
while(fscanf(fp,"%s",temp)!=EOF)//EOF即为到了文件末尾
{
printf("%-16s",temp);
count++;
}
printf("\n");
printf("The number of word is:%d\n",count);
t=strlen(temp)+1; //计算该行中总字符数,最后加1是因为字符串要以‘\0’结尾
while(j<t)
{
for(;temp[j]==32;j++); //如果串中是空格,则拼命跳过,不计
while(k<N&&temp[j]!=32) //不是空格,且没有超出题目中的要求:
//每个字串长度小于20.如果大于20,自动截除.
//必要时可以调整N的值来重定义长大
str[i][k++]=temp[j++]; //将输入行字串分割存放到结果数组中
str[i][k]='\0'; //如果该串原来大于20,会被自动截除
strcount[i]=1; //计数
for(x=0;x<i;x++) //与前面的串比较
if(strncmp(str[i],str[x],N)==0)
//调用库函数,不分大小写与前面的串相比,相同则返回0.
{
strcount[x]++; //相同,计数器数组增加
i--; //该串为重复串,总串数不增加
break; //跳出for循环
}
i++; //无重复串,则总字串数增加
k=0;
}
printf("结果:\n");
t=0;
for(;t<i;t++)//不超出总串数
printf("%s,%d\n",str[t],strcount[t]);
}
而且单词还要按字典顺序输出 展开
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 100
#define N 20
char temp[100];
char str[M][N]; //单词字串结果存放数组
int strcount[M]; //单词字串计数数组.对应每个单词串,拥有一个计算器
int i=0,j=0,k=0,t=0,x=0;
void main()
{
FILE *fp;
int count=0;
if((fp=fopen("data.txt","r"))==NULL)
{
printf("无法打开该文件!\n");
exit(0);
}
while(fscanf(fp,"%s",temp)!=EOF)//EOF即为到了文件末尾
{
printf("%-16s",temp);
count++;
}
printf("\n");
printf("The number of word is:%d\n",count);
t=strlen(temp)+1; //计算该行中总字符数,最后加1是因为字符串要以‘\0’结尾
while(j<t)
{
for(;temp[j]==32;j++); //如果串中是空格,则拼命跳过,不计
while(k<N&&temp[j]!=32) //不是空格,且没有超出题目中的要求:
//每个字串长度小于20.如果大于20,自动截除.
//必要时可以调整N的值来重定义长大
str[i][k++]=temp[j++]; //将输入行字串分割存放到结果数组中
str[i][k]='\0'; //如果该串原来大于20,会被自动截除
strcount[i]=1; //计数
for(x=0;x<i;x++) //与前面的串比较
if(strncmp(str[i],str[x],N)==0)
//调用库函数,不分大小写与前面的串相比,相同则返回0.
{
strcount[x]++; //相同,计数器数组增加
i--; //该串为重复串,总串数不增加
break; //跳出for循环
}
i++; //无重复串,则总字串数增加
k=0;
}
printf("结果:\n");
t=0;
for(;t<i;t++)//不超出总串数
printf("%s,%d\n",str[t],strcount[t]);
}
而且单词还要按字典顺序输出 展开
3个回答
展开全部
while(fscanf(fp,"%s",temp)!=EOF)//EOF即为到了文件末尾
{
printf("%-16s",temp);
count++;
}
这部分 只是读入了单词并统计了总数 实际上存在temp里面的之后最后一个 之前的都被覆盖了
下面的所有处理 都是针对最后一个单词以及一个空的str做的 本质上没什么意义
两种做法
1, 读取单词 并顺序存在str中,存好后排序,然后统计各自的次数
2 每次读取单词 与已经存在str中的逐一对比,按字典序插入,如果已经存在 则对应计数加一
推荐用第二种 更简单一点
展开全部
能不能把文件的读取先去掉再看,这样看着方便的多
追问
本来是没有的 这是我加上的 因为作业要求必须是从文件读取
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
问你个问题,data.txt你是放在哪个路径里的。
追问
放在程序所在的文件夹里面 在里面新建的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询