黑马程序员技术交流社区

标题: C编程,程序运行不起来,求各路大神指点迷津。 [打印本页]

作者: 54hxd52lj    时间: 2014-5-31 20:33
标题: C编程,程序运行不起来,求各路大神指点迷津。
本帖最后由 54hxd52lj 于 2014-6-1 10:44 编辑

找出多个字符串中的最大公共子字符串。
  1. #include<stdio.h>     //头文件
  2. #include<string.h>    //头文件
  3. void main()     //主函数
  4. {
  5. char str[2][20];    //定义二维数组,共2个,每个20个字符  
  6. int i,j,t;      //定义整形变量
  7. for(i=1;i<=2;i++)      //进行2次循环
  8.     gets(str[i]);      //循环为2个一维数组赋值
  9. char *a=str[1];    //将数组str[1]的首地址给指针a
  10. char *b=str[2];    //将数组str[2]的首地址给指针b
  11. for(j=1;j<=20;j++)      //进行20次循环
  12.     {
  13.             if(strcmp(*(a+j),*(b+j))==0)   
  14.          //判断,对两个字符串的每一个字符进行比较,如果相等,执行
  15.         {
  16.                 t=*(a+j);   //将相等的字符赋值给temp
  17.                 printf("%c",t);     //打印输出数组temp                                
  18.         }
  19.     }
  20. }
复制代码

作者: ⒈心只霸占沵    时间: 2014-5-31 20:40
你for循环的i  j为什么都要从1开始呢?
元素的索引是从0开始的  长度为2的话    就是str[0]  str[1]  没有str[2]
  1. for(int i=0;i<2,i++)
  2. {
  3. }
复制代码



作者: 54hxd52lj    时间: 2014-5-31 22:07
⒈心只霸占沵 发表于 2014-5-31 20:40
你for循环的i  j为什么都要从1开始呢?
元素的索引是从0开始的  长度为2的话    就是str[0]  str[1]  没有s ...

哦,这样啊,那我改过来试试,谢谢啦!
作者: 吉大人    时间: 2014-6-2 19:23
⒈心只霸占沵 发表于 2014-5-31 20:40
你for循环的i  j为什么都要从1开始呢?
元素的索引是从0开始的  长度为2的话    就是str[0]  str[1]  没有s ...

对,我也觉得这个地方有问题
作者: 54hxd52lj    时间: 2014-6-2 21:42
吉大人 发表于 2014-6-2 19:23
对,我也觉得这个地方有问题

谢谢啦!
作者: a1130003724    时间: 2014-6-2 21:44
学习来了

作者: 董月峰    时间: 2014-6-2 21:46
本帖最后由 董月峰 于 2014-6-2 21:55 编辑

大神代码看不懂,不明觉历!
感觉楼主大神的代码和求多个字符串的最大公共子串没有神马关系我给个求2个字符串之间最大公共子串的做法
  1. 主函数大约这么写的
  2. printf("请输入第一个字符串 :\n");
  3.         gets(ss1);
  4.         int len_s1=strlen(ss1);
  5.         printf("请输入第二个字符串 :\n");
  6.         gets (ss2);
  7.         int len_s2=strlen(ss2);
  8.         maxstr(ss1,ss2,len_s1,len_s2);
复制代码

调用的函数
  1. //比较2个字符串最大公共子串(串1,串2,串1长,串2长)
  2. void maxstr(char *s1,char *s2,int num1,int num2)
  3. {
  4.     //index表示字符相同时s1初始角标,n2表示公共子串初始长度是0,n1表示每个公共子串的长度
  5.         int index=0,n2=0,n1;
  6.     //遍历s1
  7.         for(int i = 0; i <= num1; i++)
  8.         {
  9.         //遍历s2
  10.                 for(int j = 0; j <= num2; j++)
  11.                 {
  12.             //若遇到相同字符
  13.                         if(s1==s2[j])
  14.                         {
  15.                 //先赋值子串长度是1
  16.                                 n1 = 1;
  17.                 //看从相同字符向后有多少字符还相同
  18.                                 for(int k = 1; s1[i+k]==s2[j+k]; k++)
  19.                 //每多一个相同字符,n1自增1
  20.                 {
  21.                     n1++;
  22.                 }
  23.                 //取n2为最长的n1
  24.                                 if(n1 > n2)
  25.                                 {
  26.                     //记录最长n2时候,s【i】的角标位置index
  27.                                         index = i;
  28.                                         n2 = n1;
  29.                                 }
  30.                 //再与s1比较,从s2【n1+j】即可
  31.                                 j += n1;
  32.                         }
  33.                 }
  34.         }
  35.     //当存在子串时候,输出最大的
  36.     if(n2 !=0)
  37.     {
  38.         printf("最长的公共子串:");
  39.         for(int i = 0; i < n2; i++)
  40.             printf("%c",s1[index+i]);
  41.     }
  42.     //不存在子串输出没有
  43.     else
  44.         printf("没有公共子串!\n");
  45. }
复制代码





作者: 54hxd52lj    时间: 2014-6-2 21:49
董月峰 发表于 2014-6-2 21:46
大神代码看不懂,不明觉历!
感觉楼主大神的代码和求多个字符串的最大公共子串没有神马关系
...

好吧,我正在努力中。
作者: 54hxd52lj    时间: 2014-6-2 21:50
a1130003724 发表于 2014-6-2 21:44
学习来了

与君共奋进:victory:




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2