当前位置: 首页 > news >正文

通过递归的方式将字符串逆置打印

  逆置打印字符串是有很多种方法的,个人感觉使用递归的方式很可以很容易的去理解栈的创建与析构,所以就稍微建立了模型;

  首先我们先看看理论:

  递归模型:
  1. 递归模型即是对自己本身的调用,一般用在函数或子函数函数的内部;
  2. 每调用一次函数,编译器就会分配另一个栈或堆空间;
  3. 当遇到终止条件时就开始析构函数(必须有终止条件,否则会无限分配空间内存,导致内存空间溢出,从而导致死机);

  有一个字符串"abcde",我们要将它逆置打印,也就是输出edcba,这里我们先用一个简单点的方法,通过数组的下标来打印,即将数据copy到一个数组中(数组足够大),直接将下标移到最后的位置,一个一个的往前打印;

  如下:

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <stdlib.h>
 5 
 6 
 7 void main()
 8 {
 9     //1.通过下标逆置
10     char *str = "abcde";    //一级指针指向字符串常量
11     char p[10] = {0};        //一维数组并初始化为空,防止出现乱码
12     int len = 0;            //计算数据长度
13     int i = 0;                //for循环打印数据
14     strcpy(p,str);            //将数据copy到数组中
15     len = strlen(str) - 1;        //算出字符串的长度因为,下标是从0开始,所以减一
16     
17     for(i = len ; i >= 0; i--)//直接通过下标逆置
18     {
19         printf("%c",p[i]);    //依序打印数据
20     }
21     system("pause");
22     return ;
23  
24 
25 }

 

  这个应该很容易看懂,所以我就不多做解释了,也可以通过指针来读取数据,在建立一个辅助指针变量,因为str指向字符串首地址,所以将新建的指针指向末地址,然后就和打印数组一样,一个一个的往后移,或者是直接逆置copy到一个数组中等等(切记,“abcde”是字符串常量,它拥有只读属性,也就是说不能修改它所在的内存空间只能读取数据);

  接下来就是我们要将的递归逆置打印,其实这个打印方法和数组打印很想,但是一个是正方向传递地址,一个是倒着传递地址:

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <stdlib.h>
 5 
 6 int inversion(char *p);//接受的是地址
 7 
 8 int main()
 9 {
10     char *str = "abcde";//将指针指向字符串常量
11 
12     inversion(str);//传递的是地址
13 
14     system("pause");
15     return 0;
16 }
17 
18 int inversion(char *p)
19 {
20     char *str;
21     if(*p == '\0')//如果没有数据就返回
22     {
23         return 0;
24     }
25     str = p;//将p所指向的地址赋给str
26     inversion(p+1);//因为参数是指针所以将地址赋给它
27     printf("%c",*str);
28     return 0;
29 }

  这里一定要记住一点,调用函数时inversion时,调用它的栈是不会被析构掉的,而通过它则建立了一个新的栈空间,除非一整个函数体运行或者遇到终止命令,不然不会被析构掉,也就是说每建立一个新的栈区,从中分配str和p已经和上一个栈区的变量没有关系了。也就是说str每次指向的都是新传递过来的地址,图如下:

  

  因为建立了新的栈区所以每次用来接受地址的p已经和上一个栈中的p没有关系了,它已经指向了一个新的地址,当函数遇到终止命令或者运行完时就会被自动的析构掉;

  其实因为我们传递过去的是一个字符串常量,所以我们在写函数参数是可以这样写int inversion(const char *p);声明一下我这个是只读常量,或者说用const修饰告诉别人

不允许修改我这个指针所指向的空间数据;其实在C中const是有歧义的,这个在之前的C++中的const和C中的区别我稍微写过一点,因该是C++中对于const进行了功能加强。

转载于:https://www.cnblogs.com/huhaihao/p/7756316.html

相关文章:

  • Oracle osw监控工具的使用示例
  • ASP.NET 跨平台应用开发
  • linux负载查看
  • 【漫谈数据仓库】 如何优雅地设计数据分层
  • Last_SQL_Errno: 1366
  • 那些年困扰我们的委托(C#)
  • 解决发邮件出现“501 Domain address required: HELO”问题
  • eclipse的离线汉化
  • Java新版本的开发已正式进入轨道,版本号18.3
  • sed和gawk基础
  • [C]整形提升(转载)
  • 软考高级(四)
  • 大数据等最核心的关键技术:32个算法
  • 处理数据对象的实用函数
  • es6笔记干货
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • Electron入门介绍
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • JAVA_NIO系列——Channel和Buffer详解
  • maven工程打包jar以及java jar命令的classpath使用
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • spring cloud gateway 源码解析(4)跨域问题处理
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 初识 beanstalkd
  • 给新手的新浪微博 SDK 集成教程【一】
  • 聊聊hikari连接池的leakDetectionThreshold
  • 如何实现 font-size 的响应式
  • 数组的操作
  • 翻译 | The Principles of OOD 面向对象设计原则
  • #android不同版本废弃api,新api。
  • (c语言)strcpy函数用法
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .gitignore文件—git忽略文件
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Core 版本不支持的问题
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 依赖注入和配置系统
  • .Net6 Api Swagger配置
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .net下简单快捷的数值高低位切换
  • .NET学习全景图
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • ??在JSP中,java和JavaScript如何交互?
  • @基于大模型的旅游路线推荐方案
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ 第一章] JavaScript 简史
  • [English]英语积累本