2016-02-26 81 views
-2

我不明白为什么它在到达行“if(strcmp(next,str2)== 0)return”后立即停止;“
现在我已注释掉%。*因此我可以完整地打印两个字符串,它们在到达if语句之前进行比较,因此5在我的示例输入中无关紧要。我的递归函数有问题

当我打印两个字符串“下一步”和“STR2”,下面显示
enter image description here

我可以看到字符串“ABC DEF”是不一样的“BC DEFA”,但现在看来,这满足if语句,因为它会停止选取框功能。当我注释if语句时,它会经历无限递归。
也许是同我是这么认为的我印这两个字符串
enter image description here
这表明STRCMP是-1,这不是的STRCMP程序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; 
} 
+0

我不是说你的函数'marquee'可以在这个状态下编译...你确定你在测试什么吗? – purplepsycho

+1

不测试'scanf'的返回值始终是一个惊喜。正如使用弃用的gets()函数一样。改用fgets。噢,当你返回时,会发生什么?'返回'char *'的函数? – Jens

+0

@purplepsycho,不,我不确定。我是C新手,不熟悉如何通过函数进行网格化,所以我最好的办法就是打印所有内容lol – Hispazn

回答

1

你的旋转和反转函数都在你的字符数组上就地操作。实际上,如果您查看rotate,则可以看到它始终返回str。所以,当你这样做:

char* next = rotate(str); 

所有它做它旋转就地str,然后返回str。通话结束后,nextstr的值相同,str的原始内容不再可用。

如果你想保留str,只需复制它。举例来说,你可以这样做:

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

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

+0

哦! ASDFGHJKL。 谢谢!当你滔滔不绝地说,我是否应该让我的更改更有效率? – Hispazn

+0

不,它只是意味着它会覆盖它所操作的字符串,并在此过程中有效地销毁它。有时候没关系,但在这种情况下并非如此。 –

3

的问题似乎是,你打电话marquee()strstr2是相同的指针。当你rotate(str)这对str2也“同样”(因为它们指向相同的内存。)这可能不会做你认为应该的。

而且通过各种手段,轮到你的编译器的所有警告和它捕获在marquee()return;是免费的。

+0

ohh,我想str2保持不变,所以我应该声明另一个变量可能?这将保留原文。所以像Original = str2? – Hispazn

+0

@Hispazn不,那只会创建第三个指针。您需要**将字符串指向的数据复制到**。即使用第二个字符数组或malloc一些内存,并将旧的内容复制到新内存中。 – Jens