首页 文章

字符串相似度函数 - 分段错误(核心转储)

提问于
浏览
-3

以下函数用于计算与字符串本身匹配的字符串-a [k]的所有可能后缀的数字字符 . 例如对于abaabab,后缀:abaabab,baabab,aabab ..和匹配字符:7,0,1 ..

但是我收到消息的运行时错误 - Segmentation fault(core dumped) . 有人可以告诉我代码有什么问题吗?

// a是全局声明的字符串数组,k是正在处理的当前字符串的索引

long long stringSimilarity(string s1,long long c,int k) // k is the index no of the string
{
    string s3=a[k];
    string s2;
    long long i;    
    if(s1.length() == 1)     return c;
    if(s1.length() == 0)     return -1;
    s2=s1.substr(1,s1.length()-1);
    i=0;
    while((s2[i] == s3[i]) && (i<s2.length())) ++i;
    c+=i;
    c=stringSimilarity(s2,c,k);
    return (c);
}

//在打印答案之前,将[k] .length的值添加到返回的int值中

2 回答

  • 0

    这条线是一个主要问题,导致undefined behavior

    for(i=1;i<s1.length();++i)  s2[i-1]=s1[i];
    

    原因是 s2 永远不会被初始化,并且是空的,因此对它的任何索引都将超出范围 .

    我建议您使用this list of possible std::string constructors中的第二个替代方案 .


    编辑后,您遇到以下问题:

    while((s2[i] == s3[i]) && (i<s2.length())) ++i;
    

    该行的问题在于,在将索引 i 用作 s2 的索引之后检查索引 i ,从而再次超出范围 . 您还应该再次检查 i 的长度 s3 .

  • 2

    最可能的罪魁祸首就在这条线上:

    for(i=1;i<s1.length();++i)  s2[i-1]=s1[i];
    

    您正在尝试修改空字符串 s2 的符号 . 你想做的事情可以通过以下方式完成:

    s2 = s1.substr( 1 );
    

    没有任何循环 . 如果我理解你正在尝试做的正确 .

相关问题