c语言编程实现统计字符串中英文单词的个数。并按出现频次升序排序显示每个单词出现的次数

我只会做前面统计总的单词个数,挨个统计单词(放入结构体统计)的就不会了,请大神帮帮忙!

#include <stdio.h>
#include <string.h>
//定义total函数计算总的单词个数
total(char str[])
{
int sum=0,i;
for(i=0;str[i]!='#';i++)
{
if((str[i])==' '||(str[i])==','||(str[i])=='.'||(str[i])=='?'||(str[i])=='!')
sum++;
}
printf("total=%d\n",sum);
return(sum);
}
/*定义结构体word内存放单词和个数*/
struct wordcount
{
char str1[20];
int strC;
};
void main()
{
char str[1000];
printf("输入一串英文:\n");
gets(str);
total(str);
}

第1个回答  推荐于2017-11-27
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*定义结构体word内存放单词和个数*/
typedef struct
{
char *str1[20];
int strC;
}WordAndCnt;
//定义total函数计算总的单词个数
void total(char* str,WordAndCnt* wac)
{
//int sum=0,i;
int i,j;
wac->strC=0;
for(i=0,j=0;str[i]!='#' && str[i]/*避免忘记输#的尴尬*/;i++) //你程序的输入是以字符'#'结尾的吧?不管了,你写的是这样,我就默认'#'结尾
{
if((str[i]>='a' && str[i]<='z') || (str[i]>='A' && str[i]<='Z'))//确定起始字符的位置
{
if(i==0 || !((str[i-1]>='a' && str[i-1]<='z') || (str[i-1]>='A' && str[i-1]<='Z')))
{
j=i;
}
//j++;
}
if(i>0 && !((str[i]>='a' && str[i]<='z') || (str[i]>='A' && str[i]<='Z')) &&
((str[i-1]>='a' && str[i-1]<='z') || (str[i-1]>='A' && str[i-1]<='Z')))//结束字母的位置
{
wac->str1[wac->strC]=(char*)calloc(i-j+1,sizeof(char));//分配空间 并初始化
strncpy(wac->str1[wac->strC],str+j,i-j);
wac->strC++;
}

}
if(i!=j)//把最后一个字符串也拷贝到str1里
{
wac->str1[wac->strC]=(char*)calloc(i-j+1,sizeof(char));//分配空间 并初始化
strncpy(wac->str1[wac->strC],str+j,i-j);
wac->strC++;
}
printf("total=%d\n",wac->strC);
//return(sum);
}
void main()
{
char str[1000];
WordAndCnt wac;
memset(str,0,1000);
printf("输入一串英文:\n");
gets(str);
total(str,&wac);
printf("\n\n");
if(wac.strC>0)
{
for(int i=0;i<wac.strC;i++)
{
printf("输入的第%d个单词是:%s\n",i+1,wac.str1[i]);
}
}
}追问

首先很感谢你能为我解答并写出详细程序,
但这个程序没有统计单词的频次呀。
例如输入“how are you?i fine thank you.”
就会输出“how 1次 are 1次 you 2次”以此类推这样的统计。
请问如果要统计频次的话那程序该怎么修改呢?

追答

我以为你要统计有多少个单词,你试下这个  不行再来找我。

本回答被提问者和网友采纳
相似回答