本帖最后由 周宇华 于 2014-3-21 10:30 编辑
只查出这几个错,代码右边加了注释:
- /*
- 10、 找出多个字符串中的最大公共子字符串,如“nbitheimanb”和“itheia”的最大子串是:”ithei”。(C语言)
- */
- #include<stdio.h>
- #include<string.h>
- //比较2个字符串最大公共子串(串1,串2,串1长,串2长)
- void maxstr(char *s1,char *s2,int num1,int num2)
- {
- //index表示字符相同时s1初始角标,n2表示公共子串初始长度是0,n1表示每个公共子串的长度
- int index=0,n2=0,n1;
- //遍历s1
- for(int i = 0; i < num1; i++)//去掉=号,否则数组越界
- {
- //遍历s2
- for(int j = 0; j < num; j++)//去掉=号,否则数组越界
- {
- //若遇到相同字符
- if(s1[i]==s2[j]&& s1[i] != '\0')//增加s1[i] != '\0'判断,结束符相等不比较,防止数组越界
- {
- //先赋值子串长度是1
- n1 = 1;
- //看从相同字符向后有多少字符还相同
- for(int k = 1; s1[i+k]==s2[j+k]&& s1[i+k] != '\0'; k++)//增加s1[i+k] != '\0'判断,结束符相等不比较,防止数组越界
- //每多一个相同字符,n1自增1
- {
- n1++;
- }
- //取n2为最长的n1
- if(n1 > n2)
- {
- //记录最长n2时候,s【i】的角标位置index
- index = i;
- n2 = n1;
- }
- //增加长度判断,超过长度数组就越界了
- if (j+n1 > num2) {
- printf("aaj=%d,n1=%d,num2=%d\n",j,n1,num2);
- break;
- }
- //再与s1[i]比较,从s2【n1+j】即可
- j += n1 -1;//循环会自动+1,这里减掉
- }
- }
- }
- //当存在子串时候,输出最大的
- if(n2 !=0)
- {
- printf("最长的公共子串:");
- for(int i = 0; i < n2; i++)
- printf("%c",s1[index+i]);
- }
- //不存在子串输出没有
- else
- printf("没有公共子串!\n");
- }
- int main()
- {
- //maxstr("fuckingday","doingso",10,7);
-
- /*
- */
-
- char ss1[1024],ss2[1024];
- int c=1;
- while(c==1)
- {
- system("cls");
- printf("请输入第一个字符串 :\n");
- gets(ss1);printf("[%s]\n", ss1);
- int len_s1=strlen(ss1);
- printf("请输入第二个字符串 :\n");
- gets (ss2);printf("[%s]\n", ss2);
- int len_s2=strlen(ss2);
- maxstr(ss1,ss2,len_s1,len_s2);
- printf("是否继续?(1/其他)\n");
- scanf("%d",&c);
- getchar();
- }
- }
复制代码
可能还有bug |