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

#include
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
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这一串字符逆序打印。那么我们肯定是需要使用函数的,但是根据是否使用递归我们就又可以分成两种不同方式

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

第一种:非递归方式

函数实现字符串逆序(递归与非递归两种方法哦ヾ(≧▽≦*)o_第1张图片

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

函数实现字符串逆序(递归与非递归两种方法哦ヾ(≧▽≦*)o_第2张图片

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

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

函数实现字符串逆序(递归与非递归两种方法哦ヾ(≧▽≦*)o_第3张图片

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

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

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

函数实现字符串逆序(递归与非递归两种方法哦ヾ(≧▽≦*)o_第4张图片

如何让它们重复这个过程呢?答案是将它们放在一个循环里!使用while循环,让它们两侧同时往中间走,然后将字符进行交换,当left

函数实现字符串逆序(递归与非递归两种方法哦ヾ(≧▽≦*)o_第5张图片

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

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

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

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

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

函数实现字符串逆序(递归与非递归两种方法哦ヾ(≧▽≦*)o_第6张图片

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

第二种:递归方式

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

第一步 把a拿出来

函数实现字符串逆序(递归与非递归两种方法哦ヾ(≧▽≦*)o_第7张图片

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

函数实现字符串逆序(递归与非递归两种方法哦ヾ(≧▽≦*)o_第8张图片

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

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

函数实现字符串逆序(递归与非递归两种方法哦ヾ(≧▽≦*)o_第9张图片

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

函数实现字符串逆序(递归与非递归两种方法哦ヾ(≧▽≦*)o_第10张图片

最后一步 将a拿上去!

函数实现字符串逆序(递归与非递归两种方法哦ヾ(≧▽≦*)o_第11张图片

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

首先将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啦嘻嘻

函数实现字符串逆序(递归与非递归两种方法哦ヾ(≧▽≦*)o_第12张图片

你可能感兴趣的:(#刷题,c语言)