| 这题从main函数里第三个for循环开始就看不太懂了,本人理解应该是对比字符串的时候第一个字符串的长度。大概是说第一个字符串和第二个对比找出最大的公共子字符串,找到了第一个字符串再与第三个对比,如果不是第一次对比的字符串就再全部重新对比。 希望高手们略微指点下这题的思路,能写点注释感激不尽 
 #include <stdio.h> #include <string.h> 
 #define MAX_N 20 //字符串的最大数目 #define MAX_LEN 256 //字符串的最大长度(含结束符'\0') 
 int N;//输入的字符串数 char str[MAX_N][MAX_LEN];//保存所有字符串 int Len[MAX_N];//保存字符串的长度 
 //字符串匹配,成功返回1,失败返回0 int str_match(char *s1, char *s2, int len) {     while(len > 0)     {         if(*s1 != *s2)      //如果字符不同则退出函数                          return 0;                  s1++;       //字符相同则指针后移继续对比                  s2++;                  len --;     }     return 1; } 
 void main() {     int i,s,t,l;          printf("请输入字符串的数目N(N<=%d):\n", MAX_N);          scanf("%d",&N); //输入字符串的个数          fgets(str[N], MAX_LEN, stdin);      //输入要对比的字符串的个数N          printf("请输入%d个字符串(每个字符串以回车结束):\n",N);          for(i=0; i<N; i++)      //创建N个字符串并记录所有字符串的长度     {         fgets(str, MAX_N, stdin); 
         Len = strlen(str);     }     for(l=Len[0]; l>0; l--)     {         for(s=0; s+l-1 < Len[0]; s++)           {                          int flag1 = 1;      //作为对比是否成功的一个标识                          for(i=1; i<N; i++)  //把第一个字符串             {                 int flag2 = 0;      //作为对比是否成功的一个标识                                  for(t=0; t+l-1 < Len; t++)   //循环Len(i)-l+1次                 {                     if(str_match(str[0]+s,str+t,l))  //调用函数对比字符                     {                         flag2 = 1;  //如有相同字符则重新赋值                                                  break;                     }                 } 
                 if(!flag2)      //对比失败                 {                     flag1 = 0;                     break;                 }             } 
             if(flag1)       //对比成功             {                 printf("最长公共子串为:\n");                 goto L;//跳到输出             }         }     }      L: for(i=0; i<l; i++)   //输出最长公共子串 {     printf("%c",*(str[0]+s+i)); }     printf("\n"); } 
 
 |