2

我目前正在学习 C,我无法通过这个练习。我必须创建一个递归函数来反转string1string2. 这是我的代码。我很乐意感谢您的帮助。

#include <stdio.h>
#define MAX 100

void reverse(char s1[],char s2[],int n,int j);

int main()
{
    char string1[MAX]="How Are You Mate";
    char string2[MAX]="";
    int n=0;
    int i=0;
    int j=0;

    for(i=0;string1[i]!='\0';i++)
        n++;
    reverse(string1,string2,n,j);
    printf("String-a normal:\n%s\n",string1);
    printf("String-a reverse:\n%s\n",string2);
    return 0;
}

void reverse(char s1[],char s2[],int n,int j)
{
     if(n>0)
     {
            s2[j]=s1[n];
            reverse(s1,s2,n-1,j+1);
     }
     else
            s2[j]='\0';
}
4

5 回答 5

5

就地(调用者可以在调用此函数之前制作字符串的副本)字符串反向与尾递归

void reverse (char *str, size_t len)
{
  char tmp;
  if (len-- < 2) return;

  tmp = *str;
  *str = str[len];
  str[len] = tmp;

  reverse (str+1, len -1);
}

O,如果你不想要指针:

void reverse (char str[], size_t len)
{
  char tmp;
  if (len-- < 2) return;

  tmp = str[0];
  str[0] = str[len];
  str[len] = tmp;

  reverse (str+1, len -1);
}
于 2013-03-10T11:41:07.890 回答
3

反转首先将数组的n第 - 个字符复制到. -th 字符恰好是空终止符。它成为新字符串的第一个字符,因此对于所有标准 C 例程(包括.string1string2nprintf

打电话

reverse(string1,string2,n-1,j);

main应该解决问题。中的条件reverse也应该从 更改if(n>0)if(n>=0)

于 2013-03-10T11:36:14.307 回答
2

尽管它不会结果字符串保存在任何地方,但您明白了。

#include <stdio.h>

void rev (const char* str);

int main () {
    const char str[] = "!dlrow ,olleH";

    printf("%s\n", str);

    rev(str);
    printf("\n");

    return 0;
}

void rev (const char* str) {
    char c = *str;
    if (c != '\0') {
            rev(str + 1);
        printf("%c", c);
    }
}
于 2013-03-10T11:42:51.937 回答
1

我已经更正了程序。请在下面找到更改

void reverse(char s1[],char s2[],int n,int j)
{
 if(n>0)
 {
        s2[j]=s1[n-1];
        reverse(s1,s2,--n,++j);
 }
 else
        s2[j]='\0';
}
于 2013-12-09T12:03:33.447 回答
0

我建议使用 library , size=strlen(array) 而不是

for(i=0;string1[i]!='\0';i++)
n++;

计算 arra 中有多少个字符

于 2015-06-03T15:47:19.730 回答