我的递归函数有问题
Having problems with my recursive function
我不明白为什么它在到达“if(strcmp(next,str2) == 0) return;”行后立即停止
现在我注释掉了 %.*s 打印行,这样我就可以在它到达 if 语句之前完全打印正在比较的两个字符串,因此 5 在我的示例输入中是不相关的。
当我打印两个字符串"next"和"str2"时,下面显示
我可以看到字符串 "ABC DEF" 与 "BC DEFA" 不同,但它似乎满足 if 语句,因为它停止了选取框功能。当我注释掉 if 语句时,它将经历无限递归。
可能是我想的一样所以打印了两个字符串的strcmp程序
显示strcmp是-1,不是0
谁能赐教一下?也许我只是遗漏了一些简单的东西,或者是否有更好的方法可以在 next 等于 str2 时打破我的递归。
编辑:我加入了旋转功能
int main(){
int n,i,signlength;
char sign[100]; //max 99 letters
//get number of cases
scanf("%d",&n);
//process each case
for(i=0;i<n;i++){
//ignore rest of line \n
char ic;
while ( (ic = getc(stdin)) != EOF && ic != '\n');
//take in sign string and length of sign
gets(sign);
scanf("%d",&signlength);
if(signlength >= strlen(sign))
printf("[%-*s]\n",signlength,sign);
if(signlength < strlen(sign)){
printf("%s\n",sign);
//printf("[%.*s]\n",signlength,sign);
marquee(sign,signlength,sign);
}
}
return 0;
}
char* marquee(char* str, int size, char* str2){
char* next = rotate(str);
printf("%s\n",next);
//printf("[%.*s]\n",size,next);
if(strcmp(next,str2) == 0)
return;
return marquee(next,size,str2);
}
void swap(char* a, char* b){
char temp = *a;
*a = *b;
*b = temp;
}
void reverse(char* array, int size){
int i;
for(i=0;i<size/2;i++)
swap(array + i, array + (size-i-1));
}
char* rotate(char* str){
reverse(str +1, strlen(str) -1);
reverse(str, strlen(str));
return str;
}
问题似乎是您调用 marquee()
时 str
和 str2
是同一个指针。当你 rotate(str)
这也 "does the same" 到 str2
(因为它们指向相同的内存。)这可能没有按照你的想法去做。
无论如何,打开编译器的所有警告,它会免费捕获 marquee()
中的 return;
。
您的旋转和反转函数都对您的字符数组进行就地操作。其实看rotate
,总能看到returnsstr
。所以当你这样做时:
char* next = rotate(str);
所有这一切都是在原地旋转 str
然后返回 str
。调用后next
与str
的值相同,str
原来的内容已经不存在了
如果您想保留 str
,只需复制一份即可。例如,您可以这样做:
char* next = rotate(strdup(str));
这将首先复制 str
,然后调用 rotate
,这将破坏性地修改副本,而 str
保持不变。
我不明白为什么它在到达“if(strcmp(next,str2) == 0) return;”行后立即停止
现在我注释掉了 %.*s 打印行,这样我就可以在它到达 if 语句之前完全打印正在比较的两个字符串,因此 5 在我的示例输入中是不相关的。
当我打印两个字符串"next"和"str2"时,下面显示
我可以看到字符串 "ABC DEF" 与 "BC DEFA" 不同,但它似乎满足 if 语句,因为它停止了选取框功能。当我注释掉 if 语句时,它将经历无限递归。
可能是我想的一样所以打印了两个字符串的strcmp程序
显示strcmp是-1,不是0
谁能赐教一下?也许我只是遗漏了一些简单的东西,或者是否有更好的方法可以在 next 等于 str2 时打破我的递归。
编辑:我加入了旋转功能
int main(){
int n,i,signlength;
char sign[100]; //max 99 letters
//get number of cases
scanf("%d",&n);
//process each case
for(i=0;i<n;i++){
//ignore rest of line \n
char ic;
while ( (ic = getc(stdin)) != EOF && ic != '\n');
//take in sign string and length of sign
gets(sign);
scanf("%d",&signlength);
if(signlength >= strlen(sign))
printf("[%-*s]\n",signlength,sign);
if(signlength < strlen(sign)){
printf("%s\n",sign);
//printf("[%.*s]\n",signlength,sign);
marquee(sign,signlength,sign);
}
}
return 0;
}
char* marquee(char* str, int size, char* str2){
char* next = rotate(str);
printf("%s\n",next);
//printf("[%.*s]\n",size,next);
if(strcmp(next,str2) == 0)
return;
return marquee(next,size,str2);
}
void swap(char* a, char* b){
char temp = *a;
*a = *b;
*b = temp;
}
void reverse(char* array, int size){
int i;
for(i=0;i<size/2;i++)
swap(array + i, array + (size-i-1));
}
char* rotate(char* str){
reverse(str +1, strlen(str) -1);
reverse(str, strlen(str));
return str;
}
问题似乎是您调用 marquee()
时 str
和 str2
是同一个指针。当你 rotate(str)
这也 "does the same" 到 str2
(因为它们指向相同的内存。)这可能没有按照你的想法去做。
无论如何,打开编译器的所有警告,它会免费捕获 marquee()
中的 return;
。
您的旋转和反转函数都对您的字符数组进行就地操作。其实看rotate
,总能看到returnsstr
。所以当你这样做时:
char* next = rotate(str);
所有这一切都是在原地旋转 str
然后返回 str
。调用后next
与str
的值相同,str
原来的内容已经不存在了
如果您想保留 str
,只需复制一份即可。例如,您可以这样做:
char* next = rotate(strdup(str));
这将首先复制 str
,然后调用 rotate
,这将破坏性地修改副本,而 str
保持不变。