C 我的递归函数有问题吗

C 我的递归函数有问题吗,c,string,recursion,strcmp,C,String,Recursion,Strcmp,我不明白为什么它在到达“if(strcmp(next,str2)==0)return 现在我注释掉了%.*s打印行,这样我就可以在到达if语句之前完全打印正在比较的两个字符串,这样5在我的示例输入中就不相关了 当我打印两个字符串“next”和“str2”时,以下显示 我可以看到字符串“ABC DEF”与“BC DEFA”不同,但它似乎满足if语句,因为它停止了marquee函数。当我注释掉if语句时,它将经历无限递归可能与我的想法相同,所以我打印了两个字符串的strcmp程序 它显示strcm

我不明白为什么它在到达“if(strcmp(next,str2)==0)return
现在我注释掉了%.*s打印行,这样我就可以在到达if语句之前完全打印正在比较的两个字符串,这样5在我的示例输入中就不相关了

当我打印两个字符串“next”和“str2”时,以下显示

我可以看到字符串“ABC DEF”与“BC DEFA”不同,但它似乎满足if语句,因为它停止了marquee函数。当我注释掉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;
}
intmain(){
int n,i,符号长度;
字符符号[100];//最多99个字母
//获取案例数量
scanf(“%d”和“&n”);
//处理每个案例
对于(i=0;i=strlen(符号))
printf(“[%-*s]\n”,符号长度,符号);
如果(符号长度对于(i=0;i而言,问题似乎在于调用
marquee()
str
str2
是同一个指针。当您
旋转(str)
时,这也对
str2
执行相同的操作(因为它们指向相同的内存)。这可能不会达到您认为应该达到的效果


无论如何,打开编译器的所有警告,它将捕获
返回;
中的
字幕()
免费。

您的旋转和反转功能都在您的角色阵列上运行。事实上,如果您查看
旋转
,您可以看到它总是返回
str
。因此,当您执行此操作时:

char* next = rotate(str);
它所做的一切都是旋转
str
,然后返回
str
。调用后,
next
的值与
str
的值相同,
str
的原始内容不再可用

如果要保留
str
,只需复制一份即可。例如,您可以执行以下操作:

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

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

我不确定您的函数
marquee
可以在这种状态下编译……您确定要测试什么吗?不测试
scanf
的返回值始终是surprises.As正在使用不推荐使用的get()函数。改用fgets。哦,当你从一个返回字符的函数中返回时,你会怎么想?@purplepsycho,不,我不确定。我对C不熟悉,不熟悉通过函数时如何将网格连接在一起,所以我最好的办法是打印所有内容,而不是只打印下一个ode>,同时打印
next
str
。我怀疑您的旋转功能可能正在修改
str
,从而使
next
str
都旋转。如果您显示
rotate
的代码,我将能够告诉您。好的,这正是我上面建议的。我发布了一个解决此规范的答案ific problem.ohh,我希望str2保持不变,所以我应该声明另一个变量?它可能会保存原始变量。那么像original=str2?@Hispazn不,这只会创建第三个指针。你需要复制字符串指向的数据。例如,使用第二个字符数组,或者malloc一些内存,并将旧的复制到新内存中。噢!asdfghjkl.谢谢!当你说destrutively时,我应该让我对str的更改更有效吗?不,这只是意味着它会覆盖它所操作的字符串,在这个过程中有效地销毁它。有时这没关系,但在这种情况下不是。