C 使用递归函数反转字符串

C 使用递归函数反转字符串,c,string,recursion,reverse,C,String,Recursion,Reverse,我目前正在学习C,我无法通过这个练习。我必须创建一个递归函数,将string1反转为string2。这是我的密码。我非常感谢你的帮助 #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;

我目前正在学习C,我无法通过这个练习。我必须创建一个递归函数,将
string1
反转为
string2
。这是我的密码。我非常感谢你的帮助

#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';
}
#包括
#定义最大值100
无效反向(字符s1[],字符s2[],整数n,整数j);
int main()
{
char string1[MAX]=“你的伴侣怎么样”;
字符字符串2[MAX]=“”;
int n=0;
int i=0;
int j=0;
对于(i=0;string1[i]!='\0';i++)
n++;
反向(第1条、第2条、第n条、第j条);
printf(“String-a normal:\n%s\n”,string1);
printf(“String-a反转:\n%s\n”,string2);
返回0;
}
无效反向(字符s1[],字符s2[],整数n,整数j)
{
如果(n>0)
{
s2[j]=s1[n];
反向(s1、s2、n-1、j+1);
}
其他的
s2[j]='\0';
}

反转开始于将
string1
数组的
n
-th字符复制到
string2
中。
n
-th字符恰好是空终止符。它将成为新字符串的第一个字符,因此对于所有标准C例程(包括
printf
)来说,该字符串看起来都是空的

召唤

reverse(string1,string2,n-1,j);
主菜单中
可以解决问题。
reverse
中的条件也应该从
if(n>0)
更改为
if(n>=0)

到位(调用方可以在调用此函数之前复制字符串)字符串反转和尾部递归

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);
}
void reverse(字符*str,大小长度)
{
char-tmp;
如果(len--<2)返回;
tmp=*str;
*str=str[len];
str[len]=tmp;
相反(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);
}
void reverse(字符str[],大小长度)
{
char-tmp;
如果(len--<2)返回;
tmp=str[0];
str[0]=str[len];
str[len]=tmp;
相反(str+1,len-1);
}
尽管它不会将结果字符串保存在任何地方,但您还是明白了这一点

#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);
    }
}
#包括
无效版本(常量字符*str);
int main(){
常量字符str[]=“!dlrow,olleH”;
printf(“%s\n”,str);
rev(str);
printf(“\n”);
返回0;
}
无效版本(常量字符*str){
字符c=*str;
如果(c!='\0'){
修订版(str+1);
printf(“%c”,c);
}
}

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

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

我建议使用library,size=strlen(数组)代替

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

要计算arra中有多少个字符,代码编译得很好,问题是当我打印2字符串时,它没有显示任何字符。s2[]代表第二个字符string@Lind,该练习是否提到使用递归函数反转C中的字符串(其“strings”)会带来什么好处无法轻松返回,因此不太适合该模式?它说的和你说的一样。使用递归函数并不能使程序更快,但它仍然要求使用递归函数进行练习。如果不解决此练习,我无法继续。谢谢,这是我一直在寻找的答案。我创建了条件string1[I]!='\for循环中的0,但我从第一个字符开始计数,我想这就是问题所在。我没有在函数上加n-1,但我声明了int n=-1。至于n>=0,这是必要的,谢谢。@Lind在
-1
处启动
n
也可以。顺便说一句,您可以从
main
中删除
j
的声明,因为它被指定为零,并且此后不会更改,因此您可以将
0
作为
reverse
的最后一个参数传递,以获得相同的效果。我修复了原始解决方案,是的,我理解它,虽然我必须再看一遍指针,因为我对它们没有一个清晰的概念。