使用递归函数反转字符串
我目前正在学习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中有多少个字符