力扣 https://leetcode.cn/problems/greatest-common-divisor-of-strings/
在做这道题目时,一直报内存访问越界。调试后找到问题所在,对于可能越界的地方,都需要先加上限制条件后再进行访问。
// str1 can be diveded by s or not
int canDivide(char *s, char *str1){
int lens,len1;
lens=strlen(s);
len1=strlen(str1);
if(lens==0)return 0;
if(lens>len1 || (lens==len1 && strcmp(s,str1)!=0) || len1%lens!=0)return 0;
else{
char *sCom;
sCom=(char *)malloc((len1+1)*sizeof(char));
memset(sCom,0,(len1+1)*sizeof(char));
for(int i=0;i<len1/lens;i++){
strcat(sCom,s);
}
if(strcmp(sCom,str1)==0){
free(sCom);
return 1;
}
}
return 0;
}
char * gcdOfStrings(char * str1, char * str2){
if(strcmp(str1,str2)==0)return str1;
int len1,len2,minlen;
len1=strlen(str1);
len2=strlen(str2);
minlen=len1>len2 ?len2:len1;
char *res;
res=(char *)malloc((minlen+1)*sizeof(char));
memset(res,0,(minlen+1)*sizeof(char));
char *temp;
temp=(char *)malloc((minlen+1)*sizeof(char));
memset(temp,0,(minlen+1)*sizeof(char));
int i,j;
if(len1<=len2){
for(i=0;i<len1+1;i++)
for(j=1;j<len1+1 && j+i<len1+1;j++){
for(int k=0;k<j;k++){
*(temp+k)=*(str1+i+k);
}
if(canDivide(temp,str1)==1 && canDivide(temp,str2)==1){
if(strlen(res)<j){
memcpy(res,temp,j);
}
}
}
}else{
for(i=0;i<len2+1;i++)
//必须加上判断&& (i+j)<len2+1,不然*(str2+i+k)有可能访问未知内存,即i=len2,j=len2时
for(j=1;j<len2+1 && (i+j)<len2+1;j++){
for(int k=0;k<j;k++){
*(temp+k)=*(str2+i+k);
}
if(canDivide(temp,str1)==1 && canDivide(temp,str2)==1){
if(strlen(res)<j){
memcpy(res,temp,j);
}
}
}
}
free(temp);
return res;
}