c语言 在两个英语句子中寻找最大的共同单词并返回其长度 简单版
题目:
编写一个程序,输入两个英文句子,每个句子里英文单词之间用空格分割,最后输出两者的最长公共单词
思路:
切分两个句子为一个一个的单词,分别存放到两个可以容纳很多单词的结构体数组中,并且结构体还可以存放这个单词的长度
然后拿第一句话中的单词和第二句话中的单词一一做对比即可
#include<stdio.h> #include<string.h> typedef struct{//定义一个结构体,存放单词和其单词对应的长度 char w[15]; int len; }words; typedef struct{//定义一个存放最长单词信息的结构题题 char a[15]; int maxlen; }maxone; void replace(char a[])//替换函数,将句子当中的标点符号换成空格 { for(int i=0;a[i]!='\0';i++) if(a[i]=='.') a[i]=' '; } void cut(words one[],char a[])//切分函数,将句子中的单词切分出来放到words结构题当中保存 { for(int i=0,j=0;a[i]!='\0';i++)//i在a中循环,j在one中循环,k在one.a中循环 { int k=0; while(a[i]!=' ')//以空格为一个单词的做区分 one[j].w[k++]=a[i++];//单词中的字母挨个存放到one数组的每个保存单词的字符串当中 one[j].w[k]='\0';//给最后一项给一个结束符号,上述方法编译系统不会主动添加结束符号 one[j].len=(int)strlen(one[j].w);//获取单词的长度放到单词的长度len变量当中保存 //此时,w得到一个单词,而a[i]遇到空格,通过for循环里面的i++跳过空格 ++j;//结构体数组换到下一个,来保存下一个单词的信息 } } int show(words word[])//显示单词并返回这个结构题当中保存了多少个单词 { int cnt=0;//计数器设为0 for(int i=0;i<10;i++) if(word[i].len){//若长度不为0则认为是有效的单词 ++cnt;//计数器自加 printf("%s\t",word[i].w);//显示这个单词 } return cnt;//返还结构体数组中保存了多少个单词 } maxone find(words one[], words two[],int len_one,int len_two)//寻找共同的最大长度的单词 { maxone MAX;//定义一个maxone型结构体保存最大单词的长度 MAX.maxlen=0;//首先初始化最大单词的长度为1 for(int i=0;i<len_one;i++)//遍历one,那one中的单词和two一一对比 for(int j=0;j<len_two;j++)//用two的每一个单词和one[i]做对比 if(!(strcmp(one[i].w, two[j].w)))//若发现单词一样 if(MAX.maxlen<one[i].len)//并且长度还大于已知的最大长度 { strcpy(MAX.a,one[i].w);//将找到的最大的共通单词放入MAX结构体中保存 MAX.maxlen=one[i].len; } return MAX;//返还最大的单词的信息 } int main(){ char a[]="hello everyone this is micheal here and please."; char b[]="hello everybody this is edward here and please go on."; words one[10];//执行cut函数,将切分好的单词放到one当中 words two[10];//同理,切分好以后放入two中 replace(a);//移除句子中的句号 replace(b); for(int i=0;i<10;i++)//初始化每一个结构体中的变量 { one[i].w[0]='1'; one[i].len=0; two[i].w[0]='1'; two[i].len=0; } cut(one, a);//执行切分函数,切好的单词和单词对应的长度放入结构体中保存 cut(two, b); int len_one=show(one);//获得one中有效的单词的个数 printf("\n"); int len_two=show(two);//同理 printf("\nlen_one=%d\n",len_one);//检验切分的单词数量是否正确 printf("len_one=%d\n",len_two); maxone MAX=find(one, two, len_one, len_two);//通过比对获得最长的单词的数量 printf("%s\n%d\n",MAX.a,MAX.maxlen); }
运行截图: