编程实现输入一串英文,统计其中各单词出现的个数

编程实现输入一串英文,统计其中各单词出现的个数(不区分大小写字母),以"000"作为字符串输入结束标志,例如:

   Twinkle twinkle little star 000(回车)

   twinkle little star

     2 1 1

参考一下:https://blog.csdn.net/abc5382334/article/details/26773539

如果对你有帮助,可以点击我这个回答右上方的【采纳】按钮,给我个采纳吗,谢谢
 

#include <stdio.h>
#include <string.h>
#define MAX 100

void Getsen(char s[]); //接受输入句子的函数
void Sepra(char s[],char w[50][20],char time[]); //分离单词并计数的函数
void sort (char w[50][20]); //对计数后排序并输出的函数
void main()
{
	char sen[MAX] ;
	char word[50][20],time[50];
	int i;
	memset(time,'0',50); //初始化赋值 全为字符零
	memset(word,' ',1000); //初始化赋值 全为空格
	Getsen(sen);
	Sepra(sen,word,time);
	
	for(i=0;i<50;i++) //数组time的建立是便于数据的转移
		word[i][0]=time[i];
	sort(word);
}

void Getsen(char s[]) //该函数接受输入语句中的字符
{
	printf("please input the sentence :(非英文将会自动除去)\n");
	gets(s);
}

void Sepra(char s[],char w[50][20],char time[]) //该函数用来将字符数组s中的标点去掉,分离出单词,存放在二维数组w中,数组time与w有联系,用来存放单词出现次数
{
	int i,j,m,n,p,q,sum,flag,mark[MAX] = {0};
	for(i = 0;i<MAX;i++) //初始时mark值为0,当输入的为字母时,mark为1,否则为零
	{
		if(s[i]>64&&s[i]<91)
			s[i] = s[i]+'a'-'A';
		if(s[i]>96&&s[i]<123)
			mark[i+1] = 1;
		else
			mark[i+1] = 0;
	}
	mark[0] = 0;
	for(i = 0,j = 0,m = 1;i<MAX&&j<50&&m<20;i++) //mark[i]表示第i+1个字符前面是否为字母;mark[i+1]表示第i+1个字符是否为字母
	{
		if(mark[i]==0&&mark[i+1]==1) //大写字母转换为小写,再进行后续判断
			w[j][m++]=s[i];
		if(mark[i]==1&&mark[i+1]==1)
			w[j][m++]=s[i];
		if(mark[i]==1&&mark[i+1]==0)
		{
			w[j][m++] = '\0'; //如果第i+1个字符不是字母,且它前面一个是字母,则结束这一个单词,准备开始接受下一个单词 ,并将m重新设置为1
			m = 1;
			time[j] = '1';
			++j;
		}
		for(n = 0;n<j-1;n++) //比较新接受的单词是否与前面相同
		{
			for(q = 1,sum = 0;q<20;q++)
			{
				flag = 1;
				if(w[n][q]==w[j-1][q])
					flag = 0;
				sum+=flag;
			}
			if(sum==0) //如果新接受的单词与前面相同,则删除新接受的单词,并重新接受可能是新单词的单词
			{
				--j;
				time[n] = time[n]+1;
				time[j] = '0';
				for(p = 0;p<20;p++)
					w[j][p] = ' ';
				}
		}
	}
}
void sort (char w[50][20])
{
	int i ,j,n;
	char temp[20],c;
	for(i=0;i<50;i++) //排序部分  选择排序法
	{
		c=w[i][0]; //c为单词出现次数最大值
		for(j=i+1;j<50;j++)
		{
			if(c<w[j][0]) 
				c=w[j][0]; 
			if(c!=w[i][0]) //交换
			{
				for(n=0;n<20;n++)
					temp[n]=w[i][n];
				for(n=0;n<20;n++)
					w[i][n]=w[j][n];
				for(n=0;n<20;n++)
					w[j][n]=temp[n];
			}
		}
	}
	for(i=0;i<50;i++) //输出部分
	{
		if(w[i][0]!='0')
		{
			for(j=1;j<20;j++)
			{
				if(w[i][j]!=' ')
					printf("%-c",w[i][j]);
			}
			printf("(%c) ",w[i][0]);
			if(i%4==3)
				printf("\n");
		}
	}
}

 

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^