如何在C中使用递归重复一个单词?

如何在C中使用递归重复一个单词?,c,recursion,word,repeat,C,Recursion,Word,Repeat,这是一个家庭作业,但我的输出不正确。赋值是使用递归将单词“s”重复“n”次。我不知道我是否错过了一些明显的东西,或者我走错了方向。以下是我目前掌握的代码: #include <stdio.h> #include <string.h> #include <stdlib.h> char* repeat(char* s,int n){ int len = strlen(s); char* temp = (char*)malloc(n*len*siz

这是一个家庭作业,但我的输出不正确。赋值是使用递归将单词“s”重复“n”次。我不知道我是否错过了一些明显的东西,或者我走错了方向。以下是我目前掌握的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* repeat(char* s,int n){
    int len = strlen(s);
    char* temp = (char*)malloc(n*len*sizeof(char));
    if(n == 1){
        strcpy(temp,s);
        return (temp);
    }
    else{
        //temp = (char*)realloc(temp, n*len*sizeof(char));
        return (strcat(temp, repeat(s, n-1)));
    }
}

int main(void) {
    char* s = repeat("string", 3);
    printf("Result: "); fflush(stdout);
    puts(s);
    return (EXIT_SUCCESS);
}
#包括
#包括
#包括
字符*重复(字符*s,整数n){
int len=strlen(s);
char*temp=(char*)malloc(n*len*sizeof(char));
如果(n==1){
strcpy(温度,s);
返回(临时);
}
否则{
//temp=(char*)realloc(temp,n*len*sizeof(char));
返回(strcat(温度,重复(s,n-1));
}
}
内部主(空){
char*s=重复(“字符串”,3);
printf(“结果”);fflush(标准输出);
卖出(s);
返回(退出成功);
}
我得到的输出是:Result:Ø QQstring

而它应该是字符串


非常感谢您的帮助。

主要问题是您要应用的
strcat
temp
未初始化。最后一个递归步骤中的
temp
是另一个新分配的,并在
strcat
的第二个参数中使用

除此之外,如前所述,缓冲区太小

备选解决方案的粗略建议(未经测试)


主要问题是您要应用的strcat的
temp
未初始化。最后一个递归步骤中的
temp
是另一个新分配的,并在
strcat
的第二个参数中使用

除此之外,如前所述,缓冲区太小

备选解决方案的粗略建议(未经测试)


你把它复杂化了。只要这样做:

void repeat(char* s,int n){
    printf("%s", s);
    if(n > 1)
        repeat(s, n-1);
}

int main(void) {
     printf("Result: ");
     repeat("string", 3);
     fflush(stdout);
     return (EXIT_SUCCESS);
}

你把它复杂化了。只要这样做:

void repeat(char* s,int n){
    printf("%s", s);
    if(n > 1)
        repeat(s, n-1);
}

int main(void) {
     printf("Result: ");
     repeat("string", 3);
     fflush(stdout);
     return (EXIT_SUCCESS);
}

n!=1
您在
temp
上运行
strcat
,而不初始化它。也许你想要提升
strcpy(temp,s)
if
中输出。检查strcat的参数-在调用它之前将它们打印出来可能会有帮助…malloc没有意义。您需要malloc字符串中的字符数+1(对于空终止字符),而不是
n*strlen(s)
。参数是s,我要重复的单词可以是任何单词。当
n!=1
您在
temp
上运行
strcat
,而不初始化它。也许你想要提升
strcpy(temp,s)
if
中输出。检查strcat的参数-在调用它之前将它们打印出来可能会有帮助…malloc没有意义。您需要malloc字符串中的字符数+1(对于空终止字符),而不是
n*strlen(s)
。参数是s,我想重复的单词可以是任何单词。如果只是为了打印,那么红色警报的解决方案更优雅。如果目的是分配和创建一个包含字符串的缓冲区,则此解决方案可以…7.21.3.1 strcat函数2。如果复制发生在重叠的对象之间,则行为未定义@BLUEPIXY完全正确,感谢您注意到这一点。我现在修改了代码以避免重叠…@jdehaan
len
未定义。也许你的意思是strlen(s)
。如果只是为了打印,那么红色警报的解决方案就更优雅了。如果目的是分配和创建一个包含字符串的缓冲区,则此解决方案可以…7.21.3.1 strcat函数2。如果复制发生在重叠的对象之间,则行为未定义@BLUEPIXY完全正确,感谢您注意到这一点。我现在修改了代码以避免重叠…@jdehaan
len
未定义。也许你的意思是
strlen(s)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *repeat(char *s, int n){
    int len = strlen(s);
    char *temp;
    if(n == 1){
        temp = malloc(len + 1);
        memcpy(temp, s, len + 1);
        return temp;
    }
    temp = repeat(s, n-1);
    temp = realloc(temp, n * len + 1);
    memcpy(temp + (n-1)*len, temp, len + 1);
    return temp;
}

int main(void) {
    char* s = repeat("string", 3);
    printf("Result: "); fflush(stdout);
    puts(s);
    free(s);
    return (EXIT_SUCCESS);
}
//Simplification
char *repeat(char *s, int n){
    if(n == 0){
        return NULL;
    }
    int len = strlen(s);
    char *temp = realloc(repeat(s, n-1), n * len + 1);
    memcpy(temp + (n-1)*len, s, len + 1);
    return temp;
}