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;
}