#include<stdio.h>
#include<string.h>
int main()
{
int flag=1;
while(flag)
{
char str[500],temp[10];//str为输入的一个字符串,temp为进行后续复制操作的中间变量(在此就默认单词长度不超过10)
char word[50][10],count[50]={0};//word作为一个二维数组用来记录单词,count用来记录出现次数,以下为word的二维数组的一个示例,并且给其内的值全都给成0(数组没给赋值的自动给值为0)
/*hello
world
i
like
apple*//*50行10列的二维数组,列也就是前面所说的规定的单词长度不超过10*/
int i=0,j=0,k,t;
gets(str);
while(str[i]!='\0')
{
if(i==0&&str[0]!=' ')//扫描第一个单词,并将其复制给word
{
sscanf(str,"%s",temp);//扫描
strcpy(word[j],temp);//temp复制给wrod【j】也就是第j行添加了这个单词
count[j]=1;//计数
j++;
}
else if(str[i-1]==' '&&str[i]!=' ')//前一个字符是空格,后一个字符不是空格,也就说明有了一个单词
{
sscanf(str+i,"%s",temp);//扫描
for(k=0;k<j;k++)//这个for只管下面的一个if
if(strcmp(word[k],temp)==0)//strcmp是比较字符串的函数,如果相同,值就是0
{
count[k]++;
break;
}//这个if里实现的是对于已经查询过切记录过次数的数组里的内容进行查找,如果有相同的,就对该计数数组count+1
if(k==j)//类似一个新建操作(上面的循环查询后没有已存在的单词,就要进行新建)
{
strcpy(word[j],temp);
count[j]=1;
j++;
}
}
i++;
}
for(i=0;i<j-1;i++)//这个循环是用于调整输出顺序,来达到输出结果为出现次数由多到少的顺序输出
for(k=i+1;k<j;k++)
if(count[i]<count[k])
{
strcpy(temp,word[i]);
strcpy(word[i],word[k]);
strcpy(word[k],temp);//这三个语句类似换值操作,如:t=a;a=b;b=t;
t = count[i];
count[i] = count[k];
count[k] = t;//换值
}
t=0;//防止上面操作影响下面的输出,在此初始化
for(i=0;i<j;i++)
{
printf("%s:%d个\n",word[i],count[i]);
t+=count[i];
}
printf("总数:%d\n",t);
scanf("%d",&flag);
}
}
完完全全版
于 2023-12-16 16:40:30 首次发布