【问题标题】:Having problems with my recursive function我的递归函数有问题
【发布时间】:2016-02-26 15:13:36
【问题描述】:

我不明白为什么它在到达“ 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 是否可以在这种状态下编译...您确定要测试什么吗?
  • 不测试来自scanf 的返回值总是令人惊讶的秘诀。就像使用已弃用的 gets() 函数一样。请改用 fgets。哦,当您从返回 char * 的函数中 return; 时会发生什么?
  • @purplepsycho ,不,我不确定。我是 C 新手,不熟悉通过函数时如何网格化,所以我最好的选择就是打印所有内容,哈哈
  • 不仅打印next,还打印nextstr。我怀疑您的旋转功能可能正在修改str,以便nextstr 最终都旋转。如果您显示rotate 的代码,我可以告诉您。
  • 好的,这正是我上面的建议。我发布了一个可以解决这个特定问题的答案。

标签: c string recursion strcmp


【解决方案1】:

问题似乎是你调用marquee()strstr2 是同一个指针。当您 rotate(str) 这也与 str2 “做同样的事情”(因为它们指向相同的内存。)这可能不会像您认为的那样做。

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

【讨论】:

  • 哦,我希望 str2 保持不变,所以我应该声明另一个变量吗?那将保留原件。就像 Original = str2 一样?
  • @Hispazn 不,那只会创建第三个指针。您需要复制字符串指向的数据。 IE。使用第二个 char 数组,或 malloc 一些内存并将旧内存复制到新内存。
【解决方案2】:

您的旋转和反转功能都在您的字符数组上进行就地操作。事实上,如果你查看rotate,你可以看到它总是返回str。所以当你这样做时:

char* next = rotate(str);

它在原地旋转str,然后返回str。调用后nextstr的值相同,str的原有内容不再可用。

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

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

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

【讨论】:

  • 哦! asdfghjkl。谢谢!当你断然地说,我应该对 str 进行更有效的更改吗?
  • 不,这只是意味着它覆盖了它所操作的字符串,在此过程中有效地破坏了它。有时这没关系,但在这种情况下它不是。
猜你喜欢
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 2021-01-08
  • 2020-04-27
相关资源
最近更新 更多