C 分段故障-分而治之

C 分段故障-分而治之,c,C,我正在尝试编写一个程序,使用分治方法显示最长的公共前缀。我的代码: #include <stdio.h> #include <string.h> #include <stdlib.h> const char *lcpUtil(char str1[], char str2[]) { char *result = NULL; result = (char *)malloc(sizeof(char) * 100); int n1 = st

我正在尝试编写一个程序,使用分治方法显示最长的公共前缀。我的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

const char *lcpUtil(char str1[], char str2[])
{
    char *result = NULL;
    result = (char *)malloc(sizeof(char) * 100);

    int n1 = strlen(str1), n2 = strlen(str2);
    
    for(int i = 0, j = 0; i <= n1-1 && j <= n2-1; i++, j++)
    {
        if(str1[i] != str2[j])
            break;
        strncat(result, &str1[i], 1); // append the prefix to the result string
    } 
    
    return (result);
}

const char *lcp(char **str, int l, int r)
{
    char str1[100], str2[100];
    if(l == r)
    {
        return (str[l]);
    }


    if (l < r)
    {
        int m = (l + r)/2;
        
        strcpy(str1, lcp(str, l, r));
        strcpy(str2, lcp(str, m+1, r));
    }

    return (lcpUtil(str1, str2));
}

int main(int argc, char **argv)
{
    char *arr[4] = {"apple", "application", "april", "apartment"}; // ap
    int n = 4;
    char prefix[100];

    strcpy(prefix, lcp(arr, 0 , n-1));

    if(strlen(prefix))
    {
        printf("The longest common prefix: %s\n", prefix);
    }
    else
        printf("There is no common prefix");

    return 0;
}

#包括
#包括
#包括
常量字符*lcpUtil(字符str1[],字符str2[]
{
char*result=NULL;
结果=(char*)malloc(sizeof(char)*100);
int n1=strlen(str1),n2=strlen(str2);
对于(inti=0,j=0;i调用无限递归,因为函数
lcp(str,l,r)
调用
lcp(str,l,r)

另外,未定义的行为通过使用通过
malloc()
分配的未初始化缓冲区的内容来调用,并分配给
strncmp()
中的
结果,该结果是从
lcpUtil
调用的*/
#include <string.h> /* needed for size_t */

size_t lcp_len(char *left, char *right)
{
    /* if the strings differ we are done */
if (*left != *right) return 0; 
    /* if we reached the end of the string(s) we are done) */
if ( !*left ) return 0;

    /* add 1 to the length and compare the next two characters, recursively */
return 1+lcp_len(left+1, right+1);
}

size_t lcp_fetch(char *dest, char *left, char *right)
{
if (*left != *right) { *dest=0; return 0; }
if ( !*left ) { *dest=0; return 0; }

*dest = *left;
return 1+lcp_fetch(dest+1, left+1, right+1);
}
大小(字符*左,字符*右) { /*如果字符串不同,我们就完了*/ 如果(*左!=*右)返回0; /*如果我们到达字符串的末尾,我们就完成了)*/ 如果(!*左)返回0; /*将长度加1,然后递归地比较接下来的两个字符*/ 返回1+lcp_len(左+1,右+1); } 大小(char*dest,char*left,char*right) { 如果(*left!=*right){*dest=0;返回0;} 如果(!*左){*dest=0;返回0;} *dest=*左; 返回1+lcp_fetch(dest+1,左+1,右+1); }

现在让我们称之为:


#包括
int main(int argc,字符**argv)
{
尺寸和结果;
字符结果[100];
如果(argc<3)返回1;
result_len=lcp_fetch(result,argv[1],argv[2]);
printf(“%zu:%s\n”,result\u len,result);
返回0;
}

for(int i=0,j=0;i@wildplasser)如果字符串长度不同,它们是否会有所不同?不,如果到达其中一个字符串的末尾,循环将终止。(在任何情况下,i==j)@wildplasser但即使有两个索引,代码是否工作正常(不给出seg错误),我的意思是,我不知道这将如何导致seg故障。有人说“还可以使用通过malloc()分配的未初始化缓冲区的内容调用未定义的行为,并将其分配给从lcpUtil调用的strncmp()。”这是我难以解决的问题:/A非常(使用相同的代码)昨天被问到。我已经编辑了代码以摆脱无限递归。但是不知道如何解决第二个问题,我不是用NULL初始化缓冲区以表示它是空的吗?
NULL
很快被分配的缓冲区指针覆盖,所以它没有任何意义。你必须初始化分配的缓冲区,而不仅仅是指向缓冲区的指针。谢谢你的回答,但这两个函数应该在我的lcpUtil中调用,以替换我的for和malloc,因为它们返回大小类型?我不是在做你的作业,只是给你一些提示。我不是要你解决问题,我只是根据你之前告诉我的要求澄清。
#include <string.h> /* needed for size_t */

size_t lcp_len(char *left, char *right)
{
    /* if the strings differ we are done */
if (*left != *right) return 0; 
    /* if we reached the end of the string(s) we are done) */
if ( !*left ) return 0;

    /* add 1 to the length and compare the next two characters, recursively */
return 1+lcp_len(left+1, right+1);
}

size_t lcp_fetch(char *dest, char *left, char *right)
{
if (*left != *right) { *dest=0; return 0; }
if ( !*left ) { *dest=0; return 0; }

*dest = *left;
return 1+lcp_fetch(dest+1, left+1, right+1);
}
#include <stdio.h>
int main(int argc, char **argv)
{
size_t result_len;
char result[100];

if (argc < 3) return 1;

result_len = lcp_fetch(result, argv[1], argv[2] );
printf("%zu:%s\n", result_len, result );

return 0;
}