使用递归函数反转字符串

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

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

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

调用

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

main应该解决问题。 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 (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); } 

虽然它不会结果字符串保存在任何地方,但您可以理解。

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

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

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

我建议使用库,size = strlen(数组)而不是

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

计算arra中有多少个字符