一、strlen()的工作原理

二、模拟实现strlen的三种方法

  1. 计数器方法
  2. 指针-指针
  3. 递归的方法

三、库函数实现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的三种方法

  1. 计数器方法
  2. 指针-指针
  3. 递归的方法

我们通过上述得知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,效果如下

最新文章

  1. Objective-C 原型模式 -- 简单介绍和使用
  2. 基于Python的网页文档处理脚本实现
  3. 谈谈React Native环境安装中我遇到的坑
  4. undefined symbol libiconv_open 完全解决方案
  5. Android权限安全(1)自定义,检查,使用权限
  6. 使用SurfaceView播放RGB原始视频-2016.01.22
  7. 基于webpivottable做的透视表
  8. JavaScript高级程序设计56.pdf
  9. Python之路,Day12 - 那就做个堡垒机吧
  10. Word 2010发布博客文章
  11. bzoj1188
  12. Android4.0图库Gallery2代码分析(二) 数据管理和数据加载
  13. ASP.NET Core MVC – Caching Tag Helpers
  14. Android binder机制---概述
  15. Js 调用 WebService 实例
  16. 在linux上手动搭建svn服务器
  17. Http请求报头设置
  18. jqGrid基本用法与示例
  19. 【清北学堂2018-刷题冲刺】Contest 8
  20. 使用perf工具导致系统hang死的原因

热门文章

  1. navisworks2021保姆级下载安装教程
  2. 利用KubeEdge在A500部署边缘推理任务
  3. .NET周报【12月第1期 2022-12-08】
  4. from表单前后端数据编码格式-Ajax发送json格式数据-Ajax发送文件-Django自带序列化组件-Ajax结合sweetalert
  5. 服务器迁移遇到的bug
  6. Burp Suite安装
  7. AStar寻路算法示例
  8. C++11(列表初始化+变量类型推导+类型转换+左右值概念、引用+完美转发和万能应用+定位new+可变参数模板+emplace接口)
  9. TypeScript 前端工程最佳实践
  10. vivo 实时计算平台建设实践