三种办法:字符串逆序排列(而非逆序打印)

 第一种方法:最简单的思路

int main()
{
	char arr[] = "abcdef";//把字符串放到数组里面
	int sz = sizeof(arr) / sizeof(arr[0]) - 2;//计算数组中最后一位内容的下标
	int left = 0;
	int right = sz;
	while (left < right)
	{
		int tmp = arr[left];//把数组第一位和数组最后一位元素进行交换
		arr[left] = arr[right];
		arr[right] = tmp;

		left++;
		right--;
	}

	printf("%s\n", arr);

	return 0;
}

 可能需要解释的点:

①sizeof(arr) / sizeof(arr[0])

sizeof(arr)计算的是整个数组的大小,而sizeof(arr[0])计算的是数组第一位元素的大小.

而sizeof(arr) / sizeof(arr[0]) 计算出的是这个数组里面存放内容的个数(包括'\0','\0'也保存在数组中,是字符串的结束标志,而我们创建的字符数组是用字符串赋值的,所以保存在数组中的时候会自动加上一个'\0').

②left++和right++

第一次交换是把数组和第一个元素和数组的倒数一个元素进行交换(不包括'\0'),

下一次交换应该是把数组的第二个元素和倒数第二个元素进行交换(不包括'\0'),

此时进行left++和right++是为下一次交换做准备.

第二种方法:比较简单的递归,其原理和第一种方法差不多,这里就不赘述了

void reverse(char ch[], int left, int right)
{	
	if (left < right)
	{
		reverse(ch, left + 1, right - 1);
		int tmp = ch[left];
		ch[left] = ch[right];
		ch[right] = tmp;
	}
	else return 0;

}

int main()
{
	char ch[] = "abcdef";
	int left = 0;
	int right = strlen(ch)-1;
	reverse(ch, left, right);

	printf("%s\n", ch);
	return 0;
}

第三种方法:比较难的递归,每次进行递归都把字符数组看成一个字符串.

void reverse(char ch[])
{
	int right = strlen(ch)-1;//最后一个字母的下标
	int tmp = ch[0];//暂时保存第一个数组元素
	ch[0] = ch[right];//把最后一个字符赋值到第一个字母上
	ch[right] = '\0';//最后一个字符填写'\0'
	if(strlen(ch)>=2)reverse(ch + 1);
	//判断如果字符串长度大于2就可以进行交换
	//如果只剩下一个字符就不用交换啦
	ch[right] = tmp;//把最后的'\0'补成第一个每次递归时暂存的第一个字符

}

int main()
{
	char ch[] = "abcdefg";
	reverse(ch);
	printf("%s", ch);
}

总体的思路就是:在进行第一个字符和最后一个字符交换的时候,先把最后一个字符赋值为'\0',把第一个字符的值暂存起来.这样做的好处是每次进行递归交换的时候,都能把字符数组看成一个完整的字符串.完成递进到最后一次,进行回归的时候,再把之前暂存的第一个字符赋值给最后一个字符.

结语:

这里是仙人掌,一个在厦门软件学院读书的计应专业的程序媛哈哈,这是我第一次正经写分享类的博客内容(害羞脸),这次分享的三个方法尤其是第三个让我觉得非常神奇哈哈哈,写出来有很大成就感,在学习的初阶,这些方法绝对不是单靠我一个人努力,也是向大佬请教自己思考才写出来的精华,真心大家能够看懂我分享的东西.

因为是第一次写,所以如果大家听不懂的地方可以在评论区留言,我的描述会造成歧义的话也请评论或者私聊给我,我都会看到的!!(鞠躬)

如果觉得这篇文章对你有用的话,仙人掌希望得到你的三连(点赞.评论.收藏),以后我会更努力的更新哒(认真)(深吸一口气)(害羞跑开)

  • 20
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值