这是本人自己写,真正实现多个字符串比较,的花了4个多小时实在是汗颜,若可以优化或不足请指正,多谢讨论!下面代码- #include <stdio.h>
- #include <string.h>
- int count = 0; // 保存用户输入了多少个字符串
- char ages[100][100]; // 保存用户输入的字符串数组
- char strMax[100]; // 保存公共字符串
- void maxZuichangZiFu(char str[],char str1[]) //判断最长公共字符串函数
- {
- // 定义两个指针变量,p是保存最长公共字符串首地址,q是保存相同字符的首地址
- char *p=NULL,*q=NULL;
-
- // 定义两个整型变量,n用于保存最大公共长度,n用于保存相同字符的长度
- int m=0;
- int n = 0;
-
- // 定义两个变量,保存str和str1的长度
- long l1 = strlen(str);
- long l2 = strlen(str1);
-
- for(int i = 0; i<l1; i++) // 循环str字符串的长度
- {
-
- for(int j = 0; j<l2; j++) // 循环str1字符串的长度
- {
- m = 0; // i的每次比较m清0
- // 同步比较str与str1字符串中相等的字符直到为\0时结束
- for(int k = 0;str[k+i]!='\0'&& str1[k+j]!='\0'&& str[k+i]==str1[k+j]; k++)
- {
-
- m++; // 保存相同字符的数量
- q = &str[i]; // 保存首地址
-
- }
-
- if(m>n) // 判断最大相同字符的个数
- {
- p = q; // 保存最大相同字符首地址
- n = m; // 保存最大相同字符的个数
- }
-
- }
-
- }
-
- int s=0;
- while(strMax[s++]!='\0')
- {
- strMax[s-1]='\0'; // 每次循环之前公共字符串清0
- }
-
- // 判断是否有公共子字符串
- if(n>0){
- // 保存最大公共子字符串
- for(s=0;s<n;s++){
- strMax[s]=*(p+s);
- }
-
-
- }
-
-
- }
- void yongHuShuRu() //用户输入字符串函数
- {
- char isYes[4]; // 保存用户输入的yes或其他字符
-
- // 接收用户输入的字符串
- printf ("请输入字符串\n");
- scanf("%s",ages[count]);
- printf("你存入的字符串是:ages[%d]=%s\n",count ,ages[count]);
- printf ("请输入字符串\n");
- scanf("%s",ages[count+1]);
- printf("你存入的字符串是:ages[%d]=%s\n",count+1 ,ages[count+1]);
- do
- {
- // 提示用户是否继续输入
- printf ("是否继续输入:yes继续,其它退出。\n");
- scanf("%s",isYes);
-
- // 判断用户输入的是否为yes,若为yes继续输入,否则退出循环
- if(strcmp(isYes,"yes"))
- {
- break;
- }
- else
- {
- printf ("请继续输入字符串\n");
- scanf("%s",ages[count+2]);
- printf("你存入的字符串是:ages[%d]=%s\n",count+2 ,ages[count+2]);
- }
-
- count++; // 保存用户输入了多少个字符串
-
-
- }while (1);
-
- }
- int main(void)
- {
- yongHuShuRu(); // 调用用户输入函数
- maxZuichangZiFu(ages[0],ages[1]); // 首先比较用户输入的第一和第二个字符串,取得最长公共字符串
-
- // 拿这个最长公共字符串与其他所有字符串作比较,最后取得所有字符串中最长公共字符串
- for (int i =2; i<count+2; i++)
- {
-
- maxZuichangZiFu(ages[i],strMax);
- }
-
- printf("所有字符串中最长公共字符串:%s\n",strMax); // 所有字符串中最长公共字符串
-
-
- return 0;
- }
复制代码 |
|