最长公共单词
编写函数void search(char *s1,char *s2,char *s3),从已知的两个字符串s1,s2中找出它们都包含的最长的单词放入字符串s3,约定字符串中只有小写字母和空格字符,单词用一个或一个以上空格分 隔。并写主函数输入s1,s2,调用该函数后输出s3。
输入
两行字符串,只包含小写字母和空格最。
输出
最长公共单词
样例输入
Happy new year
This year is not a leap year
样例输出
year
提示
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> // // 拷贝到平台的时候把my_fuction_lib.h注释掉. //#include "my_fuction_lib.h" //在此下方插入自定义函数对的声明: void search(char*s1,char *s2,char *s3); int split(char string_words[][50] , char *string); //主函数main int main() { char s1[100];//根据需要分配更大的维数 char s2[100]; char longest_word[100]; while( gets(s1) && gets(s2))//while(scanf("%s",str) != EOF , str == " xxx")判断读到了什么 { search(s1,s2,longest_word); printf("%s\n",longest_word);//puts(longest_word); } return 0; } //主函数结束. //在下方编写自定义函数: void search(char*s1,char *s2, char *s3) { int split(char string_words[][50] , char *string); char words_of_s1[50][50]; char words_of_s2[50][50]; int num_of_the_same_words = 0; int num_of_words_s1 = split(words_of_s1,s1); int num_of_words_s2 = split(words_of_s2,s2); char the_same_words[50][50]; /* 比较出相同的字符串. */ for(int i = 0,k = 0;i < num_of_words_s1;i++) { for(int j = 0;j < num_of_words_s2;j++) { if( strcmp(words_of_s1[i] , words_of_s2[j]) == 0 ) { strcpy(the_same_words[k++],words_of_s2[j]);/* i和j莫高混了,这是值得标记小心的 */ num_of_the_same_words ++; break; } } } /* 比较出最长的the_same_word */ int longest = strlen(the_same_words[0]); /* 此为初始化一个值 */ /* 不可太过随意 ,当然这里可先设为0 如果再你可以确定地范围内可以简单些用常数初始化 */ int longest_word_index = 0;/* 记录最大元素下标 */ for(int i = 1 ;i < num_of_the_same_words;i++) { int len_i = strlen(the_same_words[i]); if(len_i > longest) { //longest_word_index = len_i;//god,i写成len_i了 longest_word_index = i; } } strcpy(s3,the_same_words[longest_word_index]); } int split(char string_words[][50] , char *string) { int len = strlen(string); //对于比较曲折的操作,多写些情况分类的标题注释,帮助我们记住初心 int k = 0,j = 0; for(int i = 0;i<len;i++) { /* for(int j = 0;j<) */ /* 先针对一个(同一个)字符 */ /* 遇到非空格字符时 */ if(string[i] != ' ') { /* 顺便处理/判断单词切换(这个模块的安排比较讲究.容易绕弯路.) 初始化新的单词所在数组行*/ if(i > 0 && string[i-1] == ' ')/* */ { string_words[k][j++] = '\0'; k++; j = 0;/* 换行的时候别忘了把指针移到该行首; (调试的时候无法直接看到string_word[k]?,我方可以通过表达式监视来达到查看买的目的, 最好能连同k值一起监视) */ } /* 填充第k个单词的第j个字符. */ string_words[k][j++] = string[i]; } /* 遇到空字符时,直接跳过,i继续加一步 */ /*这样一来, 考虑到上头会将不同单词的字符填充到string_word的同一个单词行上,需想办法在合适的时候换行录入 于是有了上面的内层再判断,参照是原始的string */ /* 并列 */ /* 若当前字符为空格. */ // else // { // /* 判断下一个字符是否 仍为空 */ // /* 若不为空:执行k++,以读入下一个单词.*/ // if(string[i+1] != ' ') // { // /* string_words[++k][j++] = string[i]; 把这事交给上面if,实现迭代.(最外层的for 有i++ // 不过说实话,for后的i++完全可以不要预先些,这样我们到可以更加灵活的处理/控制那些地方要i++*/ // k++; // } // /* 任然为空格 */ // else // { // i++; // } // } } string_words[k][j++] = '\0'; return (k + 1); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2021-05-31 vscode和jetbrain@对python的支持@pylance@Linting的启用和关闭