c - 我的递归函数有问题

标签 c string recursion strcmp

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

当我打印两个字符串“next”和“str2”时,如下所示
enter image description here

我可以看到字符串“ABC DEF”与“BC DEFA”不同,但它似乎满足 if 语句,因为它停止了选取框功能。当我注释掉 if 语句时,它将经历无限递归。
也许我想的是一样的,所以我打印了两个字符串的strcmp程序
enter image description here
它显示 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() 时使用 strstr2 是同一个指针。当您rotate(str)时,这也对str2“执行相同的操作”(因为它们指向相同的内存。)这可能不会执行您认为应该执行的操作。

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

关于c - 我的递归函数有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35655287/

相关文章:

c - 需要帮助软件不能完全执行所需的操作

c - C 中的结构,错误为 "no member named..."

我们可以在头文件中使用带有 typedef 数据类型的 extern 关键字吗?

python - 如何跟踪这个递归程序

java - Java中基于ArrayList的二叉树实现

arrays - Rust:递归函数变异向量的指导

c++ - 从 char 数组转换/提取整数

c# - String.Contains 返回 False,当它为 True

java - ResourceBundle getLocale().getDisplayLanguage() 返回空字符串

php - 如何在不分割单词的情况下缩短字符串,同时保持在 PHP 中的字符限制内