黑马程序员技术交流社区

标题: 取出最大公有子字符串老是出错,求指教 [打印本页]

作者: Edware    时间: 2015-8-16 13:34
标题: 取出最大公有子字符串老是出错,求指教
int main(int argc, const char * argv[]) {
        //1>定义并初始化俩个字符串
          2>再定义一个字符串用来作为这俩个字符串的公有子字符串
          3>取出长度小的字符串逐个和另外一个字符串的字符比较
          4>相等赋值给公有子字符串直到长度小的字符串字符为’\0’,并赋值给公有子字符串结束。
        char *str1 ="nbitheimanb";
        char *str2 = "ithei";
        char *str3 = "gjghj";
        for (int i = 0; i < sizeof(str2); i++) {
            
            for (int j = 0; j < sizeof(str1); j++) {
               
                if(*(str1+j) == *(str2+i) && (*(str2+i)!='\0'))
                {
                    *(str3++) = *(str2+i);//此处提示出现访问坏的地址,不明白
                }

            }
                    }
        *str3 = '\0';
        printf("str3 = %s\n",str3);
        return 0;

}

作者: Edware    时间: 2015-8-16 13:36
各位大神求帮忙
作者: 960743995    时间: 2015-8-16 14:20
应该不用sizeof,而用strlen,因为str1,str2都是指针,都是8个字节。
作者: Edware    时间: 2015-8-16 22:06
960743995 发表于 2015-8-16 14:20
应该不用sizeof,而用strlen,因为str1,str2都是指针,都是8个字节。

恩,我看看
作者: wg592930    时间: 2015-8-17 11:48
共同学习

#include <stdio.h>
#include <string.h>
//定义一个函数,功能是获取两个字符串的最大公共子字符串
//形参分别为字符型指针变量str1、str2和整型常量 num1、num2
int getMaxSonStr(char *s1, char *s2, int len1, int len2)
{
    //index表示出现第一个相同字符时str1中对应字符的下标

int index = 0;
    //m 表示公共子串初始长度是0, n表示每个公共子串的长度

int m = 0, n = 0;
   
    //遍历s1

for (int i = 0; i < len1; i++)
    {
        //遍历s2

for (int j = 0; j < len2; j++)
        {

//遇到相同字符时
//s1[i] != '\0'可以防止越界

if (s1[i] ==s2[j] && s1[i] != '\0')
            {
                //子串长度为1

m = 1;
//s1[i+k]!='\0',结束符相等不比较,预防越界

        for (int k = 0; s1[i+k] == s2[j+k] && s1[i+k]!='\0'; k++)
                {
                    //没多一个相同字符,子串长度自增+1

                m++;
                }
            
                //假定n为最长的子串的长度

                if(m > n)
                {
                    //记录最长子串的起始下标

                index = i;
                    //将最长子串的长度值赋值给最大公共子串长度

                n = m;
                }
            }
        }
    }
    //当存在子串时候,输出最大的

if(m !=0)
    {
        printf("最长的公共子串:");
        for(int i = 0; i < m; i++)
        {
            printf("%c",s1[index+i]);
        }
    }
    //不存在子串输出没有

else
        printf("没有公共子串!\n");
    return 0;
}



int main(int argc, const char * agv[])
{
    //定义两个字符串str1和str2,并对其进行初始化

        char str1[110];
            char str2[110];
    //提示用户输入第一个字符串

        printf("请输入第一个字符串:\n");
    //接收用户输入的字符串

        gets(str1);
//提示用户输入第二个字符串

        printf("请输入第二个字符串:\n");
    //接收用户输入的字符串

        gets(str2);
    //计算输入字符串str1的长度

        int len_str1 = strlen("str1");
    //计算输入字符串str2的长度

        int len_str2 = strlen("str2");
   
    //调用函数,获取两个字符串的最大公共子字符串

        getMaxSonStr(str1,str2,len_str1,len_str2);

        printf("\n");
        return 0;
}





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