这题从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"); }
|