我的递归函数有问题

时间:2016-02-26 15:13:36

标签: c string recursion strcmp

我不明白为什么它在到达线后立即停止" if(strcmp(next,str2)== 0)return; "
现在我注释了%。* s的打印行,这样我就可以在到达if语句之前完全打印两个被比较的字符串,这样5在我的示例输入中是无关紧要的。

当我打印两个字符串" next"和" str2",以下显示
enter image description here

我可以看到字符串" ABC DEF"与" BC DEFA"不同但它似乎满足if语句,因为它停止了marquee功能。当我注释掉if语句时,它会经历无限递归。
也许它是相同的我认为所以我打印了两个字符串的strcmp程序
enter image description here
它显示strcmp为-1,这不是< t 0

有人可以开导我吗?也许我只是缺少一些简单的东西,或者有一个更好的方法来突破我的递归,一旦接下来等于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;
}

2 个答案:

答案 0 :(得分:3)

问题似乎是您使用marquee()str作为同一指针调用str2。当你rotate(str)这也“同样”到str2时(因为它们指向相同的记忆。)这可能不符合你的想法。

无论如何,打开编译器的所有警告,它会免费获取return;中的marquee()

答案 1 :(得分:1)

您的旋转和反向功能都可以在您的角色阵列上就地运行。事实上,如果你看rotate,你会发现它总是返回str。所以当你这样做时:

char* next = rotate(str);

所有它正在进行就地轮换str然后返回str。通话结束后,next的值与str的价值相同,str的原始内容不再可用。

如果您想保留str,只需复制一份即可。例如,您可以这样做:

char* next = rotate(strdup(str));

首先复制str,然后调用rotate,这将破坏性地修改副本,保持str不变。