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

时间:2014-06-05 19:56:20

标签: 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*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);
}

我得到的输出是:结果:Ø QèQstring

虽然它应该是stringstringstring

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

你太复杂了。就这样做:

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);
}

答案 1 :(得分:2)

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

除此之外,已经注意到缓冲区太小了。

对替代解决方案的粗略建议(未经测试)

// a recursively called function
char* repeat_rec(char* dest, char* s,int n) {
    if (n == 1) {
        strcpy(dest, s);
        return dest;
    }
    else{
        return strcat(repeat_rec(dest, s, n-1), s);
    }
}
// a main part containing initialization (avoids too many allocs)
char* repeat(char* s,int n) {
    int len = strlen(s);
    char* dest = (char*)malloc((n*len + 1)*sizeof(char));
    return repeat_rec(dest, s, n);
}

答案 2 :(得分:0)

#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;
}