方法一
思路:
这里举例字符串为abcdefg
// strlen函数,实现
int myStrlen(char arr[]) {
if (*arr != '\0'){
arr++;
return 1+ myStrlen(arr);
}
return 0;
}
// 使用指针变量来接收实参(arr数组名)
void reverse(char* arr) {
// 首先我们通过自己实现的myStrlen()函数计算字符出的字符个数
int len = myStrlen(arr);
int temp = *arr; // 1. 把a放在临时变量中
*arr = *(arr + len - 1); // 2.把f 放在a中(将字符串中最后一个元素放到首元素中)
*(arr + len - 1) = '\0'; // 3 \0放到f上 (‘\0’往前移)
//核心:当代码执行到这里时对中间字符串进行处理,指针向后移动
//只要字符串元素大于等于两个,重复上面代码,调用函数本身(递归)
if (myStrlen(arr + 1) >= 2) // 4.bcde逆序
reverse(arr+1);// 每次指针移动我们传入的地址也要对应
// 当中间所有字符串全都反转完毕结束
*(arr + len - 1) = temp; // 5 把a放在\0上
}
int main() {
// 创建一个字符数组
char arr[] = "abcdefg";
// 将数组名作为参数传递到我们自定义的反转字符串(递归)函数中
reverse(arr);
printf("逆序后的字符串为:%s", arr);
return 0;
}
分析示意图:
方法二(较简单)
思路
可以传入字符串的两个特殊位置的下标方便实现
//使用递归完成字符串逆序 abcdef
void reverse(char* arr,int left,int right){
// 交换两个元素的实现
//在left小于right前提下递归调用
if (left < right){
int temp;
temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
reverse(arr, left+1, right-1);// 两个下标会越来越接近
}
}
int main() {
char str[] = "abcdefg";
int right = strlen(str);
// 传递函数实参(数组名即第一个元素的首地址,元素的初索引,和末索引)
reverse(str,0,right-1);
// 打印实现结果
printf("%s", str);
return 0;
}
分析示意图
今日分享结束:若有不足可指出!!!