【C语言初阶】递归实现字符串逆序排列


一、问题引入

编写一个函数 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;
}

在这里插入图片描述


总结

本篇主要探讨如何通过递归来实现字符串的逆序排列,也可以通过循环等其他更好理解的方法实现,具体场合灵活应用就可以啦,欢迎大佬们提供更多思路。

  • 26
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值