一、问题引入
编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如:
char arr[] = “abcdef”;
逆序之后数组的内容变成:fedcba
二、思路
1.逆序打印和逆序排列的区别
逆序打印
:
- 逆序打印的思路:从数组首地址开始判断,如果该地址对象不是’\0’(字符串结束标志)时,地址加一,调用自身函数,再次判断,直到地址对象为’\0’时,递推结束,接下来从最后一步依次回归执行输出语句,就形成了逆序打印。
- 逆序打印只是对数组的所有元素进行反向输出,实则数组并没有发生变化。
代码如下(示例):
#include<stdio.h>
void reverse_string(char * string) {
if (*string) {
reverse_string(string + 1);
printf("%c", *string);
}
}
int main() {
char str[] = "abcdef";
reverse_string(str);
printf("\n");
int i = 0;
for (i = 0; i < 6; i++) {
printf("%c ", str[i]);
}
return 0;
}
逆序排列
:
- 逆序排列则是使数组本身发生了逆序。
2.逆序排列思路
- 先交换字符串首尾地址的对象:通过数组可以知道首地址,再给首地址加上数组的长度即可以找到尾地址,定义一个临时变量即可交换。
- 以同样的方法再继续交换剩余的字符串:但此时剩余的字符串bcdef没有\0了,编译器无法找到字符串尾地址,为了使剩余的字符串完整,每次交换的时候,先将尾字符的位置放入\0,再次计算数组长度,每置换一次将首地址加1。
- 当数组长度小于2时停止交换:当数组长度小于2时即表明已经交换到最中间的字符了。接下来再将放入\0的位置重新放入交换过来的首字符即可。
- 思路图解:
代码如下(示例):
#include<stdio.h>
void reverse(char * str) {
int len = strlen(str);
char temp = *str;
*str = *(str + len - 1);
*(str + len - 1) = '\0';
if (strlen(str+1) >= 2) {
reverse(str + 1);
}
*(str + len - 1) = temp;
}
int main() {
char str[] = "abcdefg";
int len = strlen(str);
reverse(str);
int i = 0;
for (i = 0; i < len; i++) {
printf("%c ", str[i]);
}
return 0;
}
总结
本篇主要探讨如何通过递归来实现字符串的逆序排列,也可以通过循环等其他更好理解的方法实现,具体场合灵活应用就可以啦,欢迎大佬们提供更多思路。