整体思路:创建字符串数组-->用两个指向字符串首元素的指针-->递归的方法让其中一个指针一直向后移动直到字符串末尾-->前后两个指针相呼应-->用交换两个变量的值的方法交换即可完成逆序
用到递归算法的时候,需要先给递归加一个限制条件,防止无限递归导致栈溢出。这里把这个限制条件跟字符串联想起来,发现可以利用字符串的末尾‘\0'来作为这个限制条件。
#include<stdio.h>
void reverse_string(char* parr, char* pa)
{
static int i = 0;
static int count = 0;//用于计算字符串的长度
if (*parr != '\0')//递归的限制条件
{
count++;//指针每走一步,count++
reverse_string(parr + 1, pa);//递归函数,让parr指针一直往后走,pa指针不动
}
if (i < count / 2)//交换字符的限制条件
{
int temp = pa[i];//将pa【i】存到temp变量中(交换元素三步曲)
pa[i] = *(parr - 1);//此时pa指针是指向首元素的,parr指针是指向字符串最后一个元素
*(parr - 1) = temp;
i++;
}
}
int main()
{
char arr[] = "abcdef";
char* pa = arr;//用两个指针指向首元素,为之后的交换做准备
reverse_string(arr, pa);
printf("%s\n", arr);
return 0;
}
两个指针开始都指向首元素:parr、pa,其中parr走到字符串的最后一个元素,pa则不动还是指向首元素,这样方便让他们进行交换。
运行结果: