资讯专栏INFORMATION COLUMN

C语言基础——字符串逆序(递归实现,不使用库函数)

suosuopuo / 1304人阅读

摘要:对于这题,我们要特别注意的是是字符串中的字符反向排列,不是逆序打印下面我会分别用非递归和递归的方法介绍本题。调用实现字符串逆序的函数。当字符串的长度为奇数时,中间只剩一个数组元素,并不需要交换,增加限制条件,让递归最后停下。

对于这题,我们要特别注意的是:是字符串中的字符反向排列,不是逆序打印

下面我会分别用非递归递归的方法介绍本题。

从main()函数入手

  1. 定义一个数组。
  2. 调用实现字符串逆序的函数。——本题核心
  3. 打印交换后的数组。
int main(){	char arr[] = "abcdefg";	reverse_string(arr);	printf("%s/n",arr);	return 0;}

自定义strlen()函数,计算数组长度

int my_strlen(char* arr){	int count = 0;	while (*arr!="/0")	{		count++;		arr++;	}	return count;}

法一(非递归)

  1. 定义函数类型:这里只是交换数组,不需要参数返回,所以用void。
  2. 定义两个指针:char* leftchar* right,分别指向数组首元素地址和数组最后一个元素的地址。
  3. 交换数组元素。
void reverse_string(char* arr){	char* left = arr;	char* right = arr + my_strlen(arr) - 1;  //my_strlen计算出的数组长度包括了‘/0’,因此-1获得整个数组的长度,再+arr指向最后一个元素的地址。	    while (left < right)	{		char tmp = *left;		*left = *right;		*right = tmp;		left++;		right--;	}}

法二 (递归)

解题思路:

  1. 数组char arr[] = "a b c d e f g /0" 中,每一次都交换第一个元素和最后一个元素,再加上中间元素的交换函数。
  2. 如:第一次交换 "g  reverse_string(char* arr)  a  /0"。注意:先不着急把a放入最后一个元素的地址中,令最后一个数组元素成‘/0’,a存储到临时变量tmp里。如:"g  reverse_string(char* arr)  /0", tmp=a。(原因:逆序函数传进去的是一个字符串。若不这样操作逆序函数再次调用的时候无法进行,因为此时中间剩余元素不是一个字符串)
  3. 实现递归都要有一个限制条件,若没有限制条件则会出现死递归。当字符串的长度为奇数时,中间只剩一个数组元素,并不需要交换,增加限制条件if(strlen(arr)>1),让递归最后停下。
  4. 最后把第一个元素放入最后一个元素的地址中。
void reverse_string(char* arr){	char* left = arr;	char* right = arr + my_strlen(arr) - 1;	char tmp = *left;  //临时变量,暂时存放第一个数组元素	*left = *right;	*right = "/0";	if(strlen(arr)>1)	reverse_string(arr + 1);  //left指针指向第二个数组元素	*right = tmp;}

代码整体实现及结果

#define _CRT_SECURE_NO_WARNINGS 1#includeint my_strlen(char* arr){	int count = 0;	while (*arr!="/0")	{		count++;		arr++;	}	return count;}非递归版本//void reverse_string(char* arr)//{//	char* left = arr;//	char* right = arr + my_strlen(arr) - 1;//	while (left < right)//	{//		char tmp = *left;//		*left = *right;//		*right = tmp;//		left++;//		right--;//	}//}void reverse_string(char* arr){	char* left = arr;	char* right = arr + my_strlen(arr) - 1;	char tmp = *left;	*left = *right;	*right = "/0";	if(strlen(arr)>1)	reverse_string(arr + 1);	*right = tmp;}int main(){	char arr[] = "abcdefg";	reverse_string(arr);	printf("%s/n",arr);	return 0;}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123959.html

相关文章

  • Python | 递归

    摘要:那假如我们用递归来描述这种情况呢定义基本情况其它情形所以在上述求和中的定义又用到了自己本身的定义,这就构成了递归。 说起递归,我觉得其实大部分人应该是不陌生的,递归广泛存在于生活中。比如: showImg(https://segmentfault.com/img/remote/1460000007420204?w=294&h=450); The woman in this image ...

    qieangel2013 评论0 收藏0
  • 常见八大排序(C语言实现)及动图演示

    摘要:当到达时等同于直接插入排序,此时序列已基本有序,所有记录在统一组内排好成有序序列。当面对大量数据时,希尔排序将比直接插入排序更具优势图示讲解第一趟取增量,所有间隔为的元素分在一组,在各个组中分别进行直接插入排序。 ...

    不知名网友 评论0 收藏0
  • 小李飞刀:做题第十一弹!

    摘要:第五题对称二叉树难度简单给定一个二叉树,检查它是否是镜像对称的。第十六题最大连续的个数难度简单给定一个二进制数组,计算其中最大连续的个数。第十八题平方数之和难度简单给定一个非负整数,你要判断是否存在两个整数和,使得。 写在前面 最近忙着调教新装备,没有及时的写题解,但是没有在偷懒没刷题喔~来认真整理下最近做的题目~ 之前考虑按tag来刷题,后来收到了推荐的leetcode题解,就根据上...

    ytwman 评论0 收藏0
  • 【零基础趣学C语言】- 史上最全C语言函数详解(万字图文+代码演示+图解)

    摘要:语言在设计中考虑了函数的高效性和易用性两个原则。在语言中,最常见的当属函数了。以上就是一个函数,它被称为语言的入口函数,或者主函数。例如和都是函数名。形式参数当函数调用完成之后就自动销毁了。 ...

    468122151 评论0 收藏0

发表评论

0条评论

suosuopuo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<