反转字符串的递归函数

时间:2013-12-28 13:34:49

标签: c recursion

我想做一个反转字符串的递归函数,所以我尝试了这段代码,但是它无法正常工作。 我试着解释一下我的代码:

- 我创建了一个名为'concat'的函数,这个函数将两个字符串作为参数并在concatunation之后返回一个字符串

- 在'inv'函数中,有关将一个字符串作为参数反转,我试图在每个循环中连接前一个字符串。

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

char *concat(char *ch1, char *ch2)
{
  char *ch3 = malloc((strlen(ch1) + strlen(ch2) + 1) * sizeof(char));
  strcat(ch1, ch2);
  strcpy(ch3, ch1);

  return (ch3);
}

char *inv(char *ch1, int i, char *ch2)
{
  if (i == 0)
  {
    strncat(ch2, ch1, 1);
    return ch2;
  }

  if (i > 0)
  {
    return concat(&ch1[i], inv(ch1, i - 1, ch2));
  }
}

int main(int argc, char *argv[])
{
  char ch1[10];
  char ch2[10];
  strcpy(ch2, "");
  scanf("%s", ch1);
  printf("%s", inv(ch1, strlen(ch1) - 1, ch2));
  return 0;
}

3 个答案:

答案 0 :(得分:2)

这比它需要的更复杂。只需传递两个指向函数的指针:一个指向第一个字符,一个指向最后一个字符。在函数中,交换两个指向的字符,并递归调用函数(显然有一个合适的基本情况来终止递归)。

P.S。如果你只需要打印出字符串,而不需要存储它,那么解决方案就更简单了,包括两个步骤:

  1. 打印字符串的反向,不包括第一个字符;
  2. 打印第一个字符。

答案 1 :(得分:0)

我尝试在您的政策中正确重写。

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

char *concat(char ch, char *str){
    char *cats = malloc(1 + strlen(str) + 1);
    *cats = ch;
    strcpy(cats + 1, str);
    free(str);//str is created by malloc

    return cats;
}

char *inv(char *str, int last){
/*
    if (last == 0)
        return concat(str[0], calloc(1, 1));//calloc(1,1) meant ""

    if (last > 0)
        return concat(str[last], inv(str, last - 1));
*/
    return concat(str[last], (last ? inv(str, last - 1) : calloc(1,1)));
}

int main(){
    char str[10], *p;
    scanf("%s", str);
    printf("%s", p=inv(str, strlen(str) - 1));
    free(p);
    return 0;
}

答案 2 :(得分:0)

如果你想在原地反转字符串,你可以只交换第一个和最后一个字符,然后递归调用你的函数来代替其他字符:

[a b c d e]
 e[b c d]a
 e d[c]b a

以下是示例实现:

/* Reverse a string, n is string length */
void reverse (char *str, size_t n)
{
    /* Terminate recursion - one character string
       is already reversed */
    if (n <= 1) {
        return;
    }

    /* swap first and last character */
    swap(str, 0, n-1); // TODO: implement

    /* Reverse "inner" string. "Inner" string
       starts one character after original string
       and ends one character before, thus is
       2 characters shorter */
    reverse (str+1, n-2);
}

如果要返回新字符串,可以复制输入字符串并执行反向就地操作,或修改函数以对两个分离缓冲区,输入和输出进行操作。