题目即要求
字符串逆序(递归实现),不能使用C函数库中的字符串操作函数。 char arr [] =“abedef” 逆序之后数组的内容变成: fedcba
先分析题目,如果不用递归如何实现?
双指针,一个从头走,一个从尾走,交换两个元素,直接贴代码
void reverse_string2(char* arr)
{
int len=strlen(arr);
int left=0,right=len-1;
while(left<right)//<=都可,因为当left>right或是=right时,一个元素或者小于一个元素的交换都一样
{
//交换左右变量
int temp=arr[left];
arr[left]=arr[right];
arr[right]=temp;
left++;
right--;
}
}
那么,问题来了,用递归怎么实现呢.先来看下我画的粗略图:(
依次解释下操作
- 将第一个元素存放在临时变量中.
- 将最后一个元素放在首位
- 将最后一个元素的位置置为\0,表明字符串结束位置
- 开始递归,将当前指针向后指一位,如图,a-b
- 从后一位开始递归,重复上述操作,因为表明了字符串结束位置,所以是从b-e的遍历
- 此时将最后一个元素,也就是\0,替换成临时变量中的第一个元素
注意
- 第三步和第五步不能反,必须是第三步在第五步前,否则就会变成b-a(a已经同f交换过),而达不到我们想要的效果
- 接着,因为此处是递归,递归的两个基本条件,只满足了一个逐渐逼近条件,却没有写结束递归的条件
这里递归的结束条件就是数组的长度要大于等于2,因为小于2的逆序没有意义.
下面是代码
void reverse_string(char* arr)
{
char temp=*arr;//首元素存放好
int len=strlen(arr);
*arr=*(arr+len-1);//最后一个元素到首位
*(arr+len-1)='\0';//最后一个元素等于\0,给定下次遍历的右范围
if(strlen(arr+1)>=2)
{
reverse_string(arr+1);//给定下次遍历的左范围
}
*(arr+len-1)=temp;//把当前的最后元素,也就是\0,替换成首元素
}