大体思路就是使用3个指针q temp str, temp用来保存当前查找的开始位置;q始终指向temp的下一个位置,为了在将目前最大重复子串保存到data数组时候不丢失本次开始查找的位置所以使用str指针用来保存目前查找到的max子串的起始位置
在调试过程中发现一个bug;段错误 ;原因是在初始化data时候想都没想就把data数组写成 char *data = p ;这样子就把data指向到了一个字符串常量;在后续赋值时候是不能改变data的!!!忽略了字符串常量不能改变,改变一个字符串必须使用数组或者动态内存分配。
在下面程序还有一个问题就是因为使用data[ ]数组最后返回的是data,可是是在函数Get.....中,所以当函数运行完毕时候会释放栈,造成出现一个warning :返回一个本地地址的变量。虽然在这里并不影响程序跑起来。可是如果还调用了其他函数的话,就会覆盖掉data数组的内容。从而造成错误。
在这里最好使用动态分配内存的方法 如下面所示:
收获就是因为段错误了解了gdb。
#include <stdio.h>
#include <string.h> //#include<malloc.h>char *Get_max_rptchar(char *p,int maxlen)
{
char *q ;
char *temp = p;
int max = 0;
int len ;
int i = 0 ;
char data[maxlen]; //char *data = (char *)malloc(sizeof(char)*maxlen);
char *str = p ;
while( *p !='\0' ){
len = 0 ;
q = temp+1;
p = temp ;
while (*q != '\0'){
if(*q != *p){
q++;
}
else {
p++;
q++;
len++;
}
}
str = temp ;
if(len > max){
max = len ;
for(i = 0; i < max ;i++){
data[i] =*str++;
}
data[i] = '\0';
}
temp ++ ;
}
return data ;
}
int main(void)
{
char *rptchar =Get_max_rptchar("abcdefgabcdfg",strlen("abcdefgabcdfg"));
printf("%s,%d\n",rptchar,strlen(rptchar));
//free(rptchar);
}