字符串逆序(递归实现)
代码要求:
编写一个函数 reverse_string(char * str) 递归实现。
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中的字符串操作函数。
代码思想:
要实现字符逆序我们可以先将最后一个字符与第一个字符互换,例如将‘abcdefg’变成‘gbcdefa’,然后逐个向里互换。
在这中间需要注意,我们要知道字符串的长度 这样才能知道最后一位字符的下标(即字符串长度减一),求字符串长度的函数也需要我们自己编写 (或可以调用现成的strlen库函数,此处题目要求自己写所以没有调用库函数)。
其中每次互换时,需将当前str指向的字符用tem变量保存起来,然后一直递归互换,每互换一次,都要将最后一个字符变成\0,这样才可以使递归中的最后一个字符一直在往前靠。直到递归到字符串中间时,这时后半部分已经逆序完成,又因为此时前半部分的字符被我们用tem保存起来了,所以直接将tem里面的值输出即可完成全部的逆序。
代码示例:
#include <stdio.h>
#include <stdlib.h>
int my_strLen(char str[]);//函数声明
void reverse_string(char str[]);//函数声明
int my_strLen(char str[]) {//需要一个求数组长度的函数 自定义一个my_strLen
if (str[0] == '\0') {//当数组开头为结束标志符\0时 表示数组已经遍历完毕
return 0;
}
return 1 + my_strLen(str + 1);//数组长度等于1 + 以第二个元素开头的数组长度
}
//逆序函数
void reverse_string(char str[]) {
int len = my_strLen(str);//首先求出数组长度 长度-1即为数组内最后一个字符下标
char tem = *str;//定义一个临时变量储存首字符的内容
*str = *(str + len - 1);//将最后一个元素赋值给第一个字符,完成第一组逆序
*(str + len - 1) = '\0';//将\0赋值给最后一个字符,使递归找到最后一个字符
if (my_strLen(str) > 0) {//如果数组长度不小于0 则一直递归下去
reverse_string(str + 1);
}
*(str + len - 1) = tem;//数组长度小于0,即后半部分已经逆序完毕
} //此时将前半部分的值逐个速出即可,就是tem里面存储的值
int main() {
char str[] = "abcdefg";
printf("before :%s\n", str);
reverse_string(str);
printf("after :%s\n", str);
system("pause");
return 0;
}