通过递归的方式将字符串逆置打印
Posted SmartGame
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过递归的方式将字符串逆置打印相关的知识,希望对你有一定的参考价值。
逆置打印字符串是有很多种方法的,个人感觉使用递归的方式很可以很容易的去理解栈的创建与析构,所以就稍微建立了模型;
首先我们先看看理论:
递归模型:
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进行了功能加强。
以上是关于通过递归的方式将字符串逆置打印的主要内容,如果未能解决你的问题,请参考以下文章