模拟实现strlen的三种方法
一、strlen()的工作原理
二、模拟实现strlen的三种方法
- 计数器方法
- 指针-指针
- 递归的方法
三、库函数实现strlen的思路
四、库函数的strlen同上面模拟实现strlen的区别
一、strlen工作原理
strlen函数工作原理:是计算字符串str的长度,直到空字符串结束,但不包含空字符串。(即该长度算至/0结束,但不包含/0)
通过以下代码能有一个直观的感受:
int main(){
char arr[]="abcdef";
int len=strlen(a);//"abcdef"即 'a' 'b' 'c' 'd' 'e' 'f' '\0'
//计算的是'\0'之前的元素个数
printf("%d\n",len); // 输出结果为6
return 0;
}

以上则为strlen的工作原理
即strlen计算的是字符串内'\0'之前的元素个数。(不包含'\0')
二、模拟实现strlen的三种方法
- 计数器方法
- 指针-指针
- 递归的方法
我们通过上述得知strlen的工作原理,那么我们接下来根据其工作原理实现strlen.
共有以下三种方式去实现:
ps:只有sizeof(数组名)和&(数组名),此时代表的是整个数组的地址,其余时候
数组名 仅仅代表首元素地址。在本文中,数组名 只代表首元素地址。
int my_strlen(){} //要实现的功能,如下三种方式
int main(){
char arr[]="abcdef";
int len=my_strlen(a);
printf("%d\n",len);
return 0;
}
1.计数器方式(创建了临时变量)
思路如下:将arr传递到my_strlen中,我们创建一个变量 count ,当 *arr!=0 时则 count +1, arr也+1 ,此时 *arr='b' ,arr和count再同时+1, 直到 *a=='\0'时,
我们返回 count 的值,此时的 count 的值为元素的个数。
图解如下:

算法如下:
int my_strlen(const char *str){
int count=0;
while(*str!='\0'){ //当为'\0'时,即while(0),条件为假,退出循环
count++;
str++;
}
return count;
}
2.指针-指针(创建了临时变量)
思路如下:创建指针p指向arr,当p!='\0'时,p加上1,直到p='\0',用
指针p-指针arr,此时的指针p代表的是'\0'的地址,指针arr代表的是首
元素地址,两者相减得到的值为两地址之间的元素个数。
图解如下:

当p走到'\0'的地址时, p-arr=元素的个数
实现代码如下:
int my_strlen(const char*str){
const char*p=str;
while(*p){
p++;
}
return p-str;
}
3.递归(不创建临时变量)
思路如下:通过递归的思想。
图解吐下:

ps:递归的基本思想是把一个大型复杂的问题层层转化为一个与原问题相似的规
模较小的问题来求解。
算法如下:
int my_strlen(const char*str){
if(*str = = '\0'){
return 0;
}
else
return 1+my_strlen(str+1)
}
三、参考库函数如何实现strlen

对比自身用指针实现strlen,代码更为简洁,将 while(*p){p++;} 精简为
while(*p++);
图解如下:

ps:如何查看库函数实现strlen。可看链接:如何查看库函数实现的某些函数(strlen,strcmp,strcpy等)
四、库函数的strlen同上面模拟实现strlen的区别
可通过如下代码进行区别:
#include<string.h>
#include<stdio.h>
int main(){
if(strlen("abc")-strlen("abcdef")>0)
{printf("hehe\n");
}
else
{printf("haha\n");
}
}
很显然,我们应该是打印 haha,但结果是hehe,为什么打印的是hehe
因为在strlen()的函数声明如下:size_t strlen(const char*str)
定义的类型是size_t,那么size_t又是什么类型
通过如下操作可知:
可知size_t是无符号整型,于是:无符号整型-无符号整型=无符号整型
于是打印的是hehe
我们模拟实现函数strlen返回的是int,于是当我们
调用my_strlen时,打印的便是haha,效果如下
模拟实现strlen的三种方法的更多相关文章
- JS模拟实现封装的三种方法
前 言 继承是使用一个子类继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承! JS中有很多实现继承的方法,今天我给大家介绍其中的三种吧. 1.在 Object类上 ...
- 三种方法教你如何用PHP模拟post提交数据
php模拟post传值在日常的工作中用到的不是很多,但是在某些特定的场合还是经常用到的. 下面,我整理了三种php模拟post传值的方法,file_get_contents.curl和socket. ...
- Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!
大网站都有推出自己的手机访问版本页面,不管是新闻类还是视频网站,我们在电脑是无法直接访问到手机网站的,比如我经常访问一个3g.qq.com这个手机站点,如果在电脑上直接打开它,则会跳转到其它页面,一般 ...
- 用Fiddler可以设置浏览器的UA 和 手动 --Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!
附加以一种软件的方法是:用Fiddler可以设置浏览器的UA 以下3种方法是手动的 通过伪装User-Agent,将浏览器模拟成Android设备. 第一种方法:新建Chrome快捷方式 右击桌面上的 ...
- Javascript定义类(class)的三种方法
将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越 ...
- javascript生成对象的三种方法
/** js生成对象的三种方法*/ // 1.通过new Object,然后添加属性 示例如下: var people1 = new Object(); people1.name = 'xiaohai ...
- php生成随机数的三种方法
php生成随机数的三种方法 如何用php生成1-10之间的不重复随机数? 例1,使用shuffle函数生成随机数. <?php$arr=range(1,10);shuffle($arr);for ...
- [转]Javascript定义类的三种方法
作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/07/three_ways_to_define_a_javascript_class.html 将近2 ...
- php发送post请求的三种方法示例
本文分享下php发送post请求的三种方法与示例代码,分别使用curl.file_get_content.fsocket来实现post提交数据,大家做个参考. php发送post请求的三种方法,分别使 ...
- java 获取随机数的三种方法
方法1(数据类型)(最小值+Math.random()*(最大值-最小值+1))例:(int)(1+Math.random()*(10-1+1))从1到10的int型随数 方法2获得随机数for (i ...
随机推荐
- 关于urllib.request解析网站不能decode
原因 不能decode,无论以gbk还utf8都无法正常解码,这个原因是因为 网页被gzip压缩了,需要解压缩 解决办法 import urllib.request import gzip url = ...
- Python异步协程(asyncio详解)
续上篇讲解yield from博客,上篇链接:https://www.cnblogs.com/Red-Sun/p/16889182.html PS:本博客是个人笔记分享,不需要扫码加群或必须关注什么的 ...
- 【每日一题】【DFS和回溯的区别】【BFS】104. 二叉树的最大深度-211227/220218
给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7], ...
- 【Shell脚本案例】案例1:服务器系统配置初始化
〇.目录 一.背景 新购买10台服务器,并安装Linux系统 目的:对操作系统进行配置的初始化 二.需求 1.设置时区并同步时间 2.禁用selinux安全机制 3.关闭防火墙(清空防火墙的默认策略, ...
- hook详解和应用
一.hook的作用区域 1.客户端的过程 链接服务器 拿回资源 渲染(解析资源)资源 初始化(自执行) 页面逻辑 等待用户输入 加密数据 提交数据 2.hook的本质 在这些流程任意环节中插入自己的代 ...
- ChatGPT能做什么?ChatGPT保姆级注册教程
最近 OpenAI 发布的 ChatGPT 聊天机器人很火,该聊天机器人可以在模仿人类说话风格的同时回答大量的问题. 在现实世界之中,例如数字营销.线上内容创作.回答客户服务查询,甚至可以用来帮助调试 ...
- 纷繁复杂见真章,华为云产品需求管理利器CodeArts Req解读
摘要:到底什么是需求?又该如何做好需求管理? 本文分享自华为云社区<纷繁复杂见真章,华为云产品需求管理利器 CodeArts Req 解读>,作者:华为云头条 . 2022 年 8 月,某 ...
- BUU_RE学习记录
一.easyre 1.010打开,直接搜flag,得到flag 二.reverse1 1.先查壳,得知是64位无壳,直接用IDA打开 2.shiftF12查找字符串,发现关键语句 3.查看相应代码,F ...
- Blazor组件自做十二 : Blazor Pdf Reader PDF阅读器 组件 (新版 7.1 移除pdfobject)
Blazor Pdf Reader PDF阅读器 组件 示例: https://www.blazor.zone/PdfReaders https://blazor.app1.es/pdfReaders ...
- cs231n__4.2 神经网络 Neural networks
CS231n 学习笔记 4.2 神经网络 Neural networks 之前我们已经使用了 很多线性分类函数 现在我们不用单变换的: 我们首先有线性层,然后有这个非线性计算,继而在顶层再加入另一个线 ...

