字符串的逆序

题目内容:
编写一个函数reverse_string(char * str)
实现: 将参数字符串中的字符反向排列,不是逆序打印
要求: 不能使用C函数库中的字符串操作函数。

char[]=“abcdef”;
逆置后变成:fedcba

在这给大家提供两种方法,一种是递归的,一种是非递归
一:非递归的
1.给两个指针,left放在左侧,right放在最后一个有效字符位置
2.交换两个指针位置上的字符
3.left指针往后走,right指针往前走,只要两个指针没有相遇,继续执行2步骤,两个指针相遇,循环结束.

具体的代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void reverse_string1(char* arr)
{
	int left = 0;
	int len = strlen(arr);
	int right = len - 1;
	while (left < right)
	{
		char temp = arr[left];
		arr[left] = arr[right];
		arr[right] = temp;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "abcdef";
	reverse_string1(arr);
	printf("%s\n", arr);
	system("pause");
	return 0;
}

注意,这里求size不是使用sizeof去求的,使用strlen求的字符串长度
所谓的字符串是一种特殊的字符数组~~,
必须带有\0结尾的字符数组才是字符串.
strlen所求出来的长度是不包含\0的,
sizeof求出来的是包含\0的.
依题而论,我们要使用strlen,求出来的是6,才是我们要的长度,如果是sizeof,求出来的就是7,显然不符合.
二:递归
该有的解析我都在代码块里写着.
具体代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
void reverse_string2(char* arr) 
{
	//求长度
	int len = strlen(arr);
	if (len == 0||len == 1)
	{
		return;
	}
	//交换边缘的元素
	char temp = arr[0];
	arr[0] = arr[len - 1];
	//这个操作是一个临时的操作,目的是为了让中间的"bcde"能够作为一个独立的字符串
	arr[len - 1] = '\0';
	//递归的来处理中间部分的字符串
	//为了得到中间部分的字符串,需要做两件事
	// arr+1,得到中间字符串的起始位置.
	//还需要把刚才的len-1的位置设置为\0
	//进行递归
	reverse_string2(arr + 1);
	//刚才是临时把len-1的位置设为\0了
	//当递归结束的时候,还需要把len-1的值还原成合理的值
	arr[len - 1] = temp;
}
int main()
{
	char arr[] = "abcdef";
	reverse_string2(arr);
	printf("%s\n", arr);
	system("pause");
	return 0;
}

递归,举个例子,就是你拿着钥匙去开门,开了第一扇门,房间里还有一扇门,然后接着开门,开完以后进去房间里还有门,直到开到最后一扇门,拿到自己想要的东西,然后原路返回,先关最里面的门,依次关门,最后关你开启的第一扇门.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

感冒不能喝咖啡!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值