C语言--字符串反向排列(递归)

本文介绍了如何在C语言中使用非递归和递归方法实现将字符串“abcdef”中的字符反向排列,即得到“fedcba”。非递归方法通过指针交换字符位置,而递归方法则采用分步骤处理,先将a与f互换,再对剩余部分递归操作。
摘要由CSDN通过智能技术生成

题目要求

将参数字符串中的字符反向排列,不是逆序打印。输入字符串“abcdef”,逆序之后数组要求变成“fedcba”

代码思路

字符串 a b c d e f ,反向排列也就让字符两两互换位置,分别是a和f互换,b和e互换,c和d互换,以此互换三次就可以实现反向排列。

代码实现

首先我们看不用递归的方法。函数reverse_string实现的是反向排列的功能,不需要返回值,所以用void而不是int,arr是实参,str是形参,需要用到传址调用,所以要用指针。

其中*(str + left) 和 str[left] 是一样的,只不过指针写法更加直观一些。

#include<stdio.h>
#include<string.h> //strlen需要用到的头文件

void reverse_string(char* str)
{
	int left = 0;
	int right = strlen(str) - 1; 

	while (left < right) //判断循环停止的条件
	{
		char tmp = *(str + left); //把最左边的字符放进中间变量里
		*(str + left) = *(str + right); //把最右边的字符移到最左边
		*(str + right) = tmp; //把最左边的字符移到最右边
		left++;
		right--;
	}
}

int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);
	printf("%s\n", arr);
	return 0;
}

递归实现

递归的显著特征就是大事化小,自己调用自己,让代码看起来更简洁。思路很上面类似。

首先我们想让a和f交换位置,然后剩下bcde,递归下去让b和e交换,但是这样行不通,因为再次调用reverse_string(每次调用让str+1,第二次从b开始看)后看到的是bcdea就不行了。所以要把a单独拿出来。于是就有了一下五个步骤:

第一步 :把a存放到中间变量

第二步:把末尾的f移到开头,也就是让a和f互换,但a没有放在末尾,而是暂时存放在中间变量

第三步:把原来f的位置写入 \0,也就是字符串终止的标志

第四步:现在从str+1看,只剩下bcde,使用递归

第五步:在所有字符互换结束后把a放在末尾

#include<stdio.h>
#include<string.h>
void reverse_string(char* str)
{
	char tmp = *str; //第一步
	int len = strlen(str);
	*str = *(str + len - 1); //第二步
	*(str + len - 1) = '\0'; //第三步
	if (strlen(str + 1) >= 2)
	{
		reverse_string(str + 1); //第四步
	}
	*(str + len - 1) = tmp; //第五步
}

int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);
	printf("%s\n", arr);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值