strlen库函数求字符串的长度和三种模拟实现方法

简介: strlen库函数求字符串的长度和三种模拟实现方法

前言:对于strlen库函数的使用相信大家都很熟悉了,是用来求字符串的长度,遇到'\0'终止;所需头文件是<string.h>;这一期,来讲解一下它的使用和strlen库函数的模拟实现!


1.strlen库函数的使用


这里就不多说了,直接上代码:


ec1ee67aabc948979147fd46ee553c9c.png


值得注意的是:strlen的返回值是无符号整型,这点可能会考我们用来比较大小!!!


三种模式实现方法通用思想解析:


根据strlen遇到 '\0'就结束的特性,我们模拟时,就可以以这个条件作为循环终止条件,传过去首元素的地址,利用指针接收,让指针不断++;直到解应用遇到'\0';结束循环。


2.方法1:计数器法


2.1.1方法:


定义一个计数器变量(暂定为count);每循环一次,就让count++,指针(暂定为str)str++;直到遇到'\0'循环结束,打印count的值,就是字符串的长度!!!


2.1.2具体代码:


8bfc970189ee4990bff6f0b43d5e8399.png


2.1.3代码分析:

 

我们封装成函数的形式,最后返回count的值就可以啦,然后在打印,因为我们一般是不在封装的函数里打印数据的。当然这个代码严格来写,我们还可以写更严谨一点,比如:加上断言assert;防止传过来的是空指针;也可以在指针前面加上const修饰;因为我们并不改变字符串的内容,只是求它的长度!!!


2.方法2:函数递归


2.2.1方法:


函数递归就是一个函数在它的函数体内调用它自身;你也可以理解为:一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。并且函数递归一定要有两个必要条件:


 1.存在限制条件,当满足这个限制条件的时候,递归便不再继续;

 2.每次递归调用之后越来越接近这个限制条件;


并且函数递归的思想是:大事化小!!


那么怎么大事化小呢?比如字符串abcd我们怎么操作?  


image.png


2.2.2具体代码实现:


cb2bef6be39b4f5594826a56520401ad.png

2.2.3代码分析:

 

当没遇到'\0';就返回1+my_strlen(str+1);我们长度每增加1次;就让指针往后移一位;直到遇到'\0';我们就返回0;所以假如有字符串abcd最终就会转化为====>1+1+1+1+0;下面对于这个递归过程我们用画图的形式来做一个剖析,毕竟使用递归还有一个回朔的过程;为了方便,我们暂且就用abc三个字符串来演示吧:


373390fe5e3e402886c369b70fc23d5e.png


注意:使用函数递归,并不是每次递归都打印一个值,而是等递归终止过后,回朔打印的!!!

2.方法3:指针-指针法

2.3.1方法:


这就需要我们明白指针-指针是什么呢?当然是它们中间有多少个数据啦,也就是个数了;


所以我们可以在定义一个指针(暂定为end),让end指针=初始指针str;每当循环往后走,我们不在用计数器count++;而是让指针end++;最终end指针-str指针就是中间元素的个数了!!!


2.3.2具体代码:


6755a127bcf64493a023eaa80a5e3f40.png


2.3.3代码分析:


    我们一定要弄明白指针-指针的含义====》得到的是一个数;为什么是一个说呢?因为指针代表着地址;地址在内存中是二进制表示的形式;地址-地址当然是一个数啦;所以我们用int型来接收。


总结:


以上就是strlen函数的实现和三种模拟实现方法;在这里我们还要弄清楚strlen和sizeof的区别;strlen是求字符串的大小,遇到'\0',就会终止;sizeof一般是求整型的大小;你用sizeof求字符串大小也是可以的,不过它会比strlen求的长度大1;为什么会大1?因为它会把'\0'也算上。有错误欢迎指出,一起加油啊!!!


be661379278c4004a19a19a587847519.jpg

相关文章
|
2月前
[字符串和内存函数]strcmp字符串函数的详解和模拟
[字符串和内存函数]strcmp字符串函数的详解和模拟
30 1
|
2月前
|
C语言
[字符串和内存函数]strcat字符串函数的详解和模拟
[字符串和内存函数]strcat字符串函数的详解和模拟
23 0
|
9月前
|
C语言
strlen函数【详解+模拟实现】
strlen函数【详解+模拟实现】
|
2月前
|
PHP C++
[字符串和内存函数]strcpy和strlen字符串函数的详解和模拟
[字符串和内存函数]strcpy和strlen字符串函数的详解和模拟
44 0
|
7月前
模拟实现库函数strlen
模拟实现库函数strlen
20 0
|
12月前
|
存储 Serverless
strlen函数解析与模拟实现
strlen函数解析与模拟实现
strlen函数解析与模拟实现
|
11月前
strlen函数的两种模拟方法以及使用
strlen函数的两种模拟方法以及使用
|
11月前
|
存储
模拟实现库函数--strcmp(字符二进制比较)
模拟实现库函数--strcmp(字符二进制比较)
|
11月前
模拟实现库函数strstr--查找子字符串
模拟实现库函数strstr--查找子字符串
|
程序员 编译器
【strlen】三种方法模拟实现strlen字符串函数
【strlen】三种方法模拟实现strlen字符串函数
66 0
【strlen】三种方法模拟实现strlen字符串函数