原题:求出两个字符串的最长公共子串 对原题进行了一些小扩展,能够实现由用户自由输入需要比较的字符串个数,并依次自由输入每个字符串,最后输出几个字符串的最长公共子串。 没有用到string的任何函数,求大神指教不足之处
#include <stdio.h>
//函数作用: 比较ch1 和ch2两字符指针所指的字符串中的最大子串,并将其存入ch3中 void String_getpublicstring(char *ch1,char *ch2,char *ch3) { //index用于记录最长子串的开始角标,maxCount记录最大字符串长度,count记录每个公共子串的长度用于和maxCount比较,以确定是否刷新maxCount和index的数值 int index = 0,maxCount = 0,count = 0; //遍历ch1所指的字符串 for (int i = 0; *(ch1+i)!='\0'; i++) {
//遍历ch2所指字符串,与每一个ch1字符串的字符元素相比较 for (int j = 0;*(ch2+j)!='\0'; j++) { //如果找到了第一个相同的字符,就进入分支,进行下一步的比较 if (*(ch1+i)==*(ch2+j)) { //每次比较前count要置零 count = 0; for (int k = 0;*(ch1+i+k)==*(ch2+j+k)&&*(ch1+i+k)!='\0'&&*(ch2+j+k)!='\0';k++) {
count++;
}
//将当前比较得到的子串长度与历史最大子串长度比较,以确定是否更新最大长度,和最长子串的index if (maxCount<count) { maxCount = count; index = i;
}
} } }
int j = 0; //依据比较所得的最大长度和串首索引将子串存入ch3所指的字符串 for (int k = index; k<index+maxCount; k++) { *(ch3+(j++)) = *(ch1+k); } //最后再结果字符串的末尾加'\0' *(ch3+j) = '\0';
} //函数作用 输出提示信息,并将用户输入的字符串录入对应字符串数组中 void PrintAndScanf(char *s) { int i = 0; char ch = 0;
//用static 延长num变量生命周期,这样可以记录输入字符串的次数并输出 static int num = 1; printf("请输入第%d个字符串,以回车键结束:\n",num++);
//典型的以回车符判定结束的字符串录入代码块 scanf("%c",&ch); while (ch!='\n') { *(s+i++)= ch; scanf("%c",&ch); } //为了程序安全性,习惯将每次录入完的字符串末尾手动加'\0' *(s+i) = '\0';
}
int main(int argc, const char * argv[]) {
int num = 0; printf("请输入参加比较的字符串个数:"); scanf("%d",&num);
//此处要用一个getchar吸收回车键,不然下面的第一次PrintAndScanf函数会录入缓存区剩余的回车
getchar();
//创建一个足够大的二维数组存储用户输入的每一组字符串。 //此处本想为了节省内存,写一个根据上面num数值,创建响应行数的二维数组,但是绞尽脑汁也没有想出来,有哪位大神会写的,求指教。 char ch[20][100]={0}; //做num次录入操作,将用户输入的字符串存到二维数组ch中 for (int i = 0; i<num; i++) { PrintAndScanf(*(ch+i)); } //比较二维数组中 前两个字符串,将比较结果存入第一个字符串,因为比较函数中最后有加'\0'的操作,而比较后第一组字符串中的内容就没有用处了,可以覆盖;所以可以一直用第一组字符串接收比较结果
String_getpublicstring(*ch,*(ch+1), *ch); for (int i = 2; *(ch+i)[0]!='\0'; i++) { String_getpublicstring(*(ch+i), *ch, *ch); } //字符串比较函数操作完,结果就存入了二维数组ch中的第一行字符串中,下面提取其长度信息 for (int i = 0; i<100; i++) { if (*(*ch+i)=='\0') {
printf("最大子字符串长度:%d,字符串为:",i); break; } } //因为String_getpublicstring中最后有为结果字符串加'\0'的操作,因此下面可以直接输出结果 printf("%s\n",*ch);
return 0; }
|