作者:低调 作者宣言:写好每一篇博客
前言
今天我们来讲解一下strlen函数,这是一个计算字符串长度的一个库函数,接下来我将用三种方式来模拟实现这个函数,分别是,创建临时变量法,递归法,指针法。
一、strlen函数的使用
通过msdn查询可知这是计算字符串或者字符数组长度的一个库函数,size_t是他的返回值类型,(size_t也叫unsigned int 叫做无符号整型,大家应该理解长度肯定是大于等于0的整数,但我们模拟实现的时候可以写成int类型的),对应的头文件是<string.h>,参数是const char*string ,因为你是计算他的长度,并不会改变他的内容,所以用const修饰,如果字符串为空,就返回一个空指针,也就是0.
让我们先看一段代码,在了解一下:
#include <stdio.h>
#include<string.h>
int main()
{
char arr[]="abc";
int len=strlen(arr);
printf("%d\n",len);
return 0;
}
大家看看是不是想要的结果,很显然是我们想要的,那好,我们再来看一个代码:
#include <stdio.h>
#include<string.h>
int main()
{
char arr[]={'a','b','c'};
int len=strlen(arr);
printf("%d\n",len);
return 0;}
怎么回事,15是怎么回事,我开始刚学的时候也是不懂,后来才知道,strlen计算长度的时候是必须要有一个终止条件的,他算到\0的时候就会停止计算,代码1是字符串,最好一位默认带有一个\0,这个\0不当作字符串长度,而代码2是字符数组,后面没有\0,所以计算出15这个随机值,如果想计算出这个字符数组就必须自己在数组后面加一个’\0’.才能达到想要的结果,读者可以自己下去试试。
思考:若定义一个char arr[]={‘a’,‘b’,‘c’,‘\0’,‘d’,‘e’};这时候结果是多少呢? 若定义一个char arr[]={‘a’,‘b’,‘c’,‘\\0’,‘d’,‘e’,‘\0’};这时候结果又会是怎样?
接下来进入正题,很多小伙伴很疑惑,作者你为啥不直接介绍那三种办法,我想说的是,我这篇文章也会有不知道strlen的人阅读,讲模拟实现的时候,我们的把他的原理搞清楚,我们才能更好的去理解,去实现。
二、strlen函数的模拟实现
2.1创建临时变量法
我们以代码1为例讲解: 大家可以看到arr在内存的存储,大家可以看我第一篇博客,有介绍到一个字符占一个字节,地址上每两位数占一个字节,而且是连续存放的。这样我们是不是就可以想办法,找到他在内存中首地址,然后每次走一个地址,统计走了几次,是不是就是字符串长度了 接下来用代码来给大家展示:
int my_strlen(char*str){
int count=0;
while(*str!='\0')
{
count++;
str++;}
return count;
这里需要对指针部分的知识有所了解,我们传arr过去,相当于传了首元素地址,用一个指针接收,这就找到了61这个地址,*是解引用,相当于找到里面的内容,str++,是地址位置发生变化,向后挪了一位。当地址挪到00位置处,循环停止,返回count。就是想要的结果。
达到了我们想要的结果了。
2.2递归法
递归法我将会直接给大家上代码,在用递归展开图给大家梳理一遍:
int my_strlen(char*str){
if(*str!='\0')
{
return 1+my_strlen(str+1);}
else
{
return 0;}
}
也达到了想要的结果了
思考:大家可以想想为什么要写成这样(return 1+my_strlen(str+1);)直接这样会出现什么结果(return my_strlen(str+1);)
答案:如果少了这个加1,当要求的长度只有1的时候,他返回只有0,我们也可以这么理解,这整个递归函数中如果没这个加1,他每次只能返回+0的数,达不到想要的结果。理解这个,递归法应该就能了解清楚了。
2.3指针法
指针法建立在创建临时变量的基础上,通过地址的变化来达到想要的结果,刚才我们是先找到了首元素的地址,然后一个一个的遍历,当\0才结束循环,因为刚才也介绍,字符串在内存的存储是连续的,这样我们可以这样是实现,我们可以定义两个指针,一个指向首地址,一个指向尾地址,把两个位置相减,不就是想要的结果吗,此图是end指向\0,停止进入循环,实际指向’c‘的地址。 我们来对照着图写代码:
int my_strlen(char*str){
char*star=str;
char*end=str;
while(*end!='\0'){
end++;}
return end-star;}
我们也达到了想要的结果了。
总结
相信通过上面三种办法,我们对strlen函数又进一步的了解了,其他原理都一样,通过对地址的访问,来统计数量的一种方式,虽然库函数给我们提供了对应的函数,但我们通过对他的理解,自己实现了这个库函数的功能,第一,提高我们的思维能力,第二,是我们在使用这个函数时更加的得心应手。
在这儿里给读者分享一个经验,学习是一个循序渐进的东西,每个知识点看起来很简单,就好比这个strlen函数,但他里面大有学问,我们能做到的就是不放弃,作者也是一步一步这样过来的,和你们分享学习经验,一起学习,一起进步,才能成长的更快!!
|