函数实现字符串逆序(递归与非递归两种方法哦ヾ(≧▽≦*)o

#include<stdio.h>
int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
void reverse_string(char* str)
{
	int left = 0;
	int right = my_strlen(str) - 1;
	while (left < right)
	{
		char tmp = str[left];
		str[left] = str[right];
		str[right] = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "abcdef";//首先定义数组为字符串abcdef
	reverse_string(arr);//调用函数,使得数组arr内的字符串逆序调换
	printf("%s\n", arr);//打印逆序转换之后的字符串arr
	return 0;
}
#include<stdio.h>
int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
void reverse_string(char* str)
{
	char tmp = *str;
	int len = my_strlen(str);
	*str = *(str + len - 1);
	*(str + len - 1) = '\0';
	if (my_strlen(str + 1)>=2)
	{
		reverse_string(str + 1);
	}
	*(str + len - 1) = tmp;
}
int main()
{
	char arr[] = "abcdef";//首先定义数组为字符串abcdef
	reverse_string(arr);//调用函数,使得数组arr内的字符串逆序调换
	printf("%s\n", arr);//打印逆序转换之后的字符串arr
	return 0;
}

我们要实现将abcdef这一串字符逆序打印。那么我们肯定是需要使用函数的,但是根据是否使用递归我们就又可以分成两种不同方式

————————这是一条分割线(❁´◡`❁)———————————

第一种:非递归方式

我们要实现字符串的逆序,最最基本的思路就是对字符串进行两两交换。首先定义逆序交换字符串的函数名为reverse_string,即字符串交换,我们需要让这个函数在调用是能够交换字符abcdef

那么下一步,我们就要去定义这个逆序交换字符串的函数reverse_string

本函数目的为实现字符串逆序,所以不需要返回值,我们设定函数返回值为void,同时函数参数设置为存储字符的char类型,数组名arr是数组arr首元素的地址,即为a的地址;char*str,即char*的指针接受a的地址

接着我们用两个整型来表示第一个字符a和最后一个字符f的下标,字符a的下标为0即int left = 0;字符f的下标我们可以用字符串的长度减去1,即int right = strlen(str)-1,同时引入头文件#include<string.h>

下一步,就将left与right进行交换,借助一个中间变量tmp

先将str[left]赋给char tmp,再将str[right]赋给str[left],最后将tmp赋给str[right]即可。

如何让它们重复这个过程呢?答案是将它们放在一个循环里!使用while循环,让它们两侧同时往中间走,然后将字符进行交换,当left<right时执行这个循环。什么?为什么不是left=right,喂,一个字符还有左右交换的必要嘛?

拓展问题:万一题目中规定了不允许使用C语言中的库函数我们该怎么办?

也就是说我们不能使用strlen而需要自己去写一个my_strlen的函数

由于strlen后面括号里面是str,那么我们也需要一个str指针来接收即为char*str

接着定义一个计数器 int count=0

如果*str!=\0说明这时我找到了一个非\0的字符,这时计数器count要++一下,str指针也要++一下,向后找一个字符;最终返回计数器即为字符串长度(or字符个数)

—————————(´▽`ʃ♡ƪ)这是第二条分割线—————————

第二种:递归方式

采用递归方式那么我们就要思考一下递归该如何实现首尾两个数的交换

第一步 把a拿出来

第二步:把f放到原来a的位置

第三步 将原来f的位置放上\0

为什么不是直接将a放在原来f的位置呢?如果我们将a直接放在原来f的位置,那么在调用reverse函数的时候就会从b开始然后读取b c d e a多了一个a,这样交换的时候就会将首项b与最后的a交换,为了防止这种情况出现,我们选择先在原来f的位置放上\0,使得调用reverse函数的时候读取b c d e 遇到\0时停止

第四步 对b c d e 进行逆序

最后一步 将a拿上去!

那么我们该如何用代码来实现这一过程?

首先将a拿出来:我们需要引入一个新的字符型变量,然后将字符a的地址赋给新变量tmp,即为char tmp =*str,*str指向的是最开始a的位置。

下一步我们需要将f放在a的位置。先调用my_strlen函数计算字符串的总长度,引入整型变量len,通过int len = my_strlen(str)得到

接着我们用f的地址来代替a的地址,通过*str=*(str + len – 1)来实现

第三步我们需要在f的空位放上\0,只需要将\0放在f的地址上即可,即为*(str+len-1)=’\0’

第四步进行中间四个字符的逆序翻转,这时我们可以直接调用reverse函数,但是在调用函数之前需要给出判断条件,否则程序无法结束,我们知道,当只有一个字符或者没有字符的时候是不需要逆序的,因此我们对于中间字符判断是否需要逆序的时候,首先需要设定字符个数大于等于2即if(my_strlen(str+1)>=2),再调用reverse函数

最后一步将a放回去,这就简单啦~只需要用tmp的地址放到原来f地址那里就可以咧,*(str+len-1)=tmp就OK啦嘻嘻

  • 0
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

拍拍脑袋瓜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值