题目大意是这样的:给定一个字符串使用递归的方法将字符串逆序,注意是不是逆序打印,并不使用string.h的库函数
思路:字符串逆序首先要知道字符串数组的长度,又不能调用库函数,顾需要自己写一个能实现strlen的函数,使逆序函数调用,所以需要两个函数:
1. 能求出字符串数组长度的数组
2. 实现字符串逆序的函数(调用第一个函数来得到数组长度)
实现第一个函数:
这个函数其实很简单可以用递归来实现也可以用循环来实现我这里就直接放出源码了
递归实现:
int my_strlen(char *p)
{
int n = 0;
if (*p != '\0')
{
return 1+my_strlen(p + 1);
}
else
{
return 0;
}
}
循环实现
int my_strlen(char* p)
{
int n = 0;
while (*p != '\0')
{
n += 1;
p++;
}
return n;
}
实现第二个函数:
假设我们要使字符串“abcdefg”逆序,逆序实际上是交换首尾的字符,顾设第一个字符和最后一个字符分别序号为 left =0 和 right=my_strlen§-1 ,将最右边的字符即p[right]与p[left]交换,然后递归fun(p+1),但是如果这样做,我们会发现左边边的指针移向了下一位,但是右边的还停留在上一个,而如果要使做右边指针移动必须知道递归次数,这样非常不方便,如图
void reverse(char* p)
{
int left = 0;
int right = my_strlen(p)-1;
char temp;
temp = p[left];
p[left] = p[right];
p[right] = temp;
reverse(p+1);
}
如果右边指针能随着递归次数增加而自己往左边移动这个问题就迎刃而解了,这时就有一个巧妙的方法:
我们将p[left]的值存入temp, 并将p[right]赋值给p[left], 然后令p[right]=’\0’
void reverse(char* p)
{
int left = 0;
int right = my_strlen(p)-1;
char temp;
temp = p[left];
p[left] = p[right];
p[right] = '\0';
reverse(p + 1);
p[right] = temp;
}
这样p+1进入下一次递归时,由于my_strlen()函数只能返回’\0’前字符的个数, 使p[right]指针往左移了一位效果如图
这是进行了多次递归,如果没有对递归进行限制函数会进入死循环,顾要满足一定条件才能进入reverse(p+1),而这个条件很明显是my-strlen§>1,如果字符串长度小于一就没有交换的必要了。
void reverse(char* p)
{
int left = 0;
int right = my_strlen(p)-1;
char temp;
temp = p[left];
p[left] = p[right];
p[right] = '\0';
if (right>0)
{
reverse(p + 1);
}
p[right] = temp;
}
最终递归的流程如图:
最终代码:
#include<stdio.h> //递归使字符串逆序
int my_strlen(char *p)
{
int n = 0;
if (*p != '\0')
{
return 1+my_strlen(p + 1);
}
else
{
return 0;
}
}
void reverse(char* p)
{
int left = 0;
int right = my_strlen(p)-1;
char temp;
temp = p[left];
p[left] = p[right];
p[right] = '\0';
if (right>0)
{
reverse(p + 1);
}
p[right] = temp;
}
int main()
{
char arr[] = "abcdefg";
reverse(arr);
printf("%s", arr);
return 0;
}
有错误欢迎大家指正,谢谢
一、在百度统计网站中添加自己的网站 1、官网地址: https://tongji.baidu.com/w...
微软将在10月份推送Windows 10下半年最重要的更新,将系统升级到Windows 10 20H2...
4 - Statement 本概述是从《JDBCTM Database Access from JavaTM: A Tutorial an...
在GridView控件中,第0列有放一个CheckBox控件,现想实现对CheckBox进行单...
在实际的开发工作过程中我们会经常遇到在本地测试没有什么问题但是线上会有问题...
我们在进行前端开发中必然会遇到PC与移动端的适配,面对这样的问题有些公司会准...
扩展正则表达式的一些字符是: “.”匹配任何单个的字符。 一个字符类“[...]”...
在某些情况下,需要重新使用data中的数据,但是data中的数据已经被各种表单、变...
JWT是什么 JWT是json web token缩写。它将用户信息加密到token里,服务器不保存...
FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺...