问题描述:
编写一个函数Reverse(char *arr)(递归实现)
实现:将参数字符串中的字符反向排列。
要求:不能使用处C库函数中的字符串操作函数。
递归求字符串长度
递归如何模仿实现strlen()函数呢?
int Strlen(char *arr)
{
if(*arr=='\0') //指针数组加及往后退几位,不加不减就是首位字符
{
return 0; //递归要有出口
}
else
{
return 1+Strlen(arr+1);//每次字符串向后一位接近出口向后几次加几次,直到'\0'处
}
}
递归求字符串逆序
void Reverse (char *arr)
{
int ret = Strlen(arr);//运用刚才写的函数
if(ret<=1)
{
return;//void 中用return 是类似于循环语句中的break,直接结束函数。
}
else
{
char temp = arr[0];
arr[0] = arr[ret-1];
arr[ret-1] = '\0';//目的是让这个字符串对称的那个数都一一对应
//因为下一条语句会让字符串往后推一位,例如此时arr指的是arr[0]的地址
//那么执行完下一个语句后,arr[0]的地址就是原来的arr[1];
Reverse(arr+1); //
arr[ret-1] = temp;//最后再把对称的那个数填充上去
}
}
比如上图数组,将*arr即a[0]的值先存放到temp中,然后arr[ret-1]即e的值赋给a[0],然后令arr[ret-1]的值为'\0',下一次调用Reverse函数时,数组就变成这样:
b对应d,arr[ret-1]就是d了。
最后就剩个C了,此时字符串长度小于等于1,次函数结束,函数的逆序完成。
最终代码