C语言,修改代码使只显示出现次数最多的10个单词及其出现次数
答案:2 悬赏:10
解决时间 2021-02-16 09:44
- 提问者网友:西路不相离
- 2021-02-16 03:51
可以读出文件中出现所有单词的出现次数并显示,求只显示出现次数最多的10个单词及其出现次数,请在原代码上修改
现代码如下:
#include
#include
#include
#include
struct Word {
char w[20];
int k;
struct Word *next;
};
int main(int argc, char *argv[])
{
FILE *fp = fopen("input.txt","r");
struct Word *Head = NULL;
while (!feof(fp)) {
char *p = (char *)malloc(20*sizeof(char));
fscanf(fp, "%s", p);
if(Head == NULL){
struct Word *temp = (struct Word *)malloc(sizeof(struct Word));
strcpy(temp->w, p);
temp->k = 1;
temp->next = NULL;
Head = temp;
} else {
struct Word *pp = Head;
while (pp != NULL) {
if (strcasecmp( pp->w, p) == 0){
++pp->k;
break;
} else {
pp = pp->next;
}
}
if (pp == NULL){
struct Word *temp = (struct Word *)malloc(sizeof(struct Word));
strcpy(temp->w, p);
temp->k = 1;
temp->next = Head;
Head = temp;
}
}
}
struct Word *q = Head;
while (q != NULL) {
printf("%s ", q->w);
printf("%d\n", q->k);
q = q->next;
}
return 0;
}
最佳答案
- 二级知识专家网友:山鬼偶尔也合群
- 2021-02-16 04:41
#include
#include
struct
{
char str[99]; //单词
int n; //出现次数
}a[99]={"",0},t; //初始化
int main()
{
FILE *fp;
unsigned i,j,times=0;
fp=fopen("test.txt","r");
if(fp==NULL)return 1;
for(i=0;i<99;i++)
{
fscanf(fp,"%s",a[i].str);//输入字符串存储到结构体中
a[i].n++; //计算出现次数
for(j=0;j
if(strcmp(a[i].str,a[j].str)==0) //如果和前面的相同
{
if(a[j].n!=0)a[j].n++; //不为0的加一
a[i].n=0; //置为0
}
times++; //计算字符串个数
if(fgetc(fp)==EOF)break;
}
for(i=0;i
for(j=0;j
if(a[j].n
{ //交换结构体
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for(i=0;i<10;i++) //输出前十个出现次数最多
printf("%s %d\n",a[i].str,a[i].n);
return 0;
}
全部回答
- 1楼网友:樣嘚尐年
- 2021-02-16 06:17
帮你写了一个,看看吧。根据自己的实际情况再改改,如果有必要的话:
#include <stdio.h>
#include <string.h>
#define m 1000
#define n 20
void main()
{
char str1[m][n];//单词字串结果存放数组
char str2[m];//输入串或者用char *str2也可,这样可以
int strc[m];//单词字串计数数组.对应每个单词串,拥有一个计算器
int i=0,j=0,k=0,t=0,x=0;
gets(str2);//接受行输入
t=strlen(str2)+1;//计算该行中总字符数
printf("输入字串为:%s\n",str2);
while(j<t)
{
for(;str2[j]==32;j++);//如果串中是空格,则拼命跳过,不计
while(k<n&&str2[j]!=32) //不是空格,且没有超出题目中的要求: 每个字串长度小于n.如果大于n,自动截除.
str1[i][k++]=str2[j++]; //将输入行字串分割存放到结果数组中
str1[i][k]='\0'; //如果该串原来大于20,会被自动截除
strc[i]=1; //计数
for(x=0;x<i;x++) //与前面的串比较
if(strncmp(str1[i],str1[x],n)==0)//调用库函数,不分大小写与前面的串相比,相同则返回0.
{
strc[x]++; //相同,计数器数组增加
i--; //该串为重复串,总串数不增加
break; //跳出for循环
}
i++; //无重复串,则总字串数增加
k=0;
}
printf("结果:\n");
t=0;
for(;t<i;t++)//不超出总串数
printf("%s,%d\n",str1[t],strc[t]);
}
我要举报
大家都在看
推荐资讯