strlen 的三种模拟方法

简介: strlen 的三种模拟方法

前言:

在C/C++ 中,strlen函数是一种计算字符串长度的库函数,要模拟此函数有多种方法,这里总结三种模拟方法。



1. strlen 函数介绍

  cplusplus - strlen

4c985f18723bd8325acbb8e43df77361_6db4849242f14859a7d2fed66972307b.png

strlen 函数的功能是计算字符串长度;

返回 size_t 类型(unsigned int 无符号整型)的数值;

使用此函数,只需传一个数组名。


一个字符串的末尾默认放有 '\0' ,通过统计 '\0' 之前出现的字符个数即可求得字符串长度,接下来的模拟都是按照这一思路


2.实现结果


2.1直观暴力型


循环 + 计数器即可

size_t my_strlen1(const char* str)
{
  assert(str != NULL);
    //断言,保证传入的字符不为空
  size_t len = 0; //普通的计数
  while (*str != '\0')  //普通的循环
  {
    len++;
    str++;
  }
  return len;
}


2.2指针 - 指针型


这种类型的思路 就是事先保存字符串起始位置的地址,后利用指针单独自加,最后两指针做差得出中间所夹字符个数。

size_t my_strlen2(const char* str)
{
  assert(str != NULL);
  char* start = str;
  while (*str)  //用单个字符本身做判断条件,当 '\0' 时不再进入循环
  {
    str++;
  }
  return str - start;
}


2.3递归型


strlen 也可以用递归实现啦 ~

思路就是 依然以不遇到 '\0' 为判断条件,满足条件就返回该字符(1)

继续用该函数从下一个字符开始统计

size_t my_strlen3(const char* str)
{
  assert(str != NULL);
  if (*str != '\0')
    return  1 + my_strlen3(str + 1);
  else
    return 0;
}

评价:

直观暴力型:最容易想到,中规中矩;

指针 - 指针型:代码小巧简洁;

递归型:累电脑,不容易想到,但可装x 。

你喜欢哪种呢?

目录
相关文章
|
开发者
AppsFlyer 研究(十六)广告平台配置及代理商授权总结
AppsFlyer 研究(十六)广告平台配置及代理商授权总结
926 0
|
4月前
|
人工智能 自然语言处理 JavaScript
Github又一AI黑科技项目,打造全栈架构,只需一个统一框架?
Motia 是一款现代化后端框架,融合 API 接口、后台任务、事件系统与 AI Agent,支持 JavaScript、TypeScript、Python 多语言协同开发。它提供可视化 Workbench、自动观测追踪、零配置部署等功能,帮助开发者高效构建事件驱动的工作流,显著降低部署与运维成本,提升 AI 项目落地效率。
408 0
|
8月前
|
传感器 监控 网络协议
《鸿蒙软总线:基于UDP的数据传输奥秘与优势》
鸿蒙系统的分布式软总线以UDP协议为基础,构建了高效的多设备互联传输机制。通过UDP的无连接特性,软总线实现快速设备发现与广播通信,优化数据传输流程,引入流式传输和双轮驱动机制,提升可靠性与效率。其高带宽、低时延特性适用于文件共享、音视频传输等场景,同时智能适应复杂网络环境,确保稳定传输。简化开发流程降低门槛,助力鸿蒙生态繁荣,为万物互联提供核心技术支撑。
367 14
|
JSON 前端开发 Go
前端文件下载的方式
【10月更文挑战第5天】
391 58
|
人工智能 大数据 云计算
AI时代:企业IT人员的阿里云发展之路
在AI浪潮中,企业IT人员面临挑战与机遇。阿里云作为行业领跑者,提供重要借鉴。IT人员需拥抱持续学习,利用阿里云涵盖云、大数据、AI等全面服务进行自我提升;参与阿里云培训和认证,增强实战经验及交流,紧跟技术趋势与市场动态,从而在AI时代中找准定位,实现职业新突破。
340 5
|
存储 缓存 大数据
三种交换方式的比较
互联网核心部分主要由路由器构成,负责分组交换。路由器是网络中转发数据的关键,它接收和转发分组,确保边缘部分的主机间通信。通信方式包括: 1. 电路交换- 用于早期电话系统,先建立连接,然后通话,最后释放,适合连续大数据传输,但线路利用率低。 2. **分组交换** - 常见于现代互联网,数据被分割成分组,每个独立转发,提高了线路效率和灵活性。 3. 报文交换-整个报文一次性转发,存储转发,适合小规模、非实时通信,但时延较长。 分组交换结合了高效和灵活性,是互联网核心的优选技术。
982 5
|
Ubuntu Linux Python
UserWarning: Glyph 27668 (\N{CJK UNIFIED IDEOGRAPH-6C14}) missing from current font.
UserWarning: Glyph 27668 (\N{CJK UNIFIED IDEOGRAPH-6C14}) missing from current font.
1065 2
|
Kubernetes Cloud Native Devops
【阿里云云原生专栏】DevOps与云原生的融合:阿里云CI/CD流水线最佳实践
【5月更文挑战第23天】阿里云融合DevOps与云原生技术,提供高效CI/CD解决方案,助力企业提升研发效能。通过云效平台,集成代码管理、构建服务、容器服务、持续部署及监控日志组件,实现自动化研发流程。案例中,应用从GitHub构建到Kubernetes部署,全程无缝衔接。借助阿里云,企业能快速构建适应云原生的DevOps体系,以应对复杂需求和提升市场竞争力。
505 1
|
NoSQL 关系型数据库 MySQL
Windows、Linux、Mac安装数据库(mysql、MongoDB、Redis)#0
不同系统下进行MySQL安装、MongoDB安装、Redis安装【2月更文挑战第5天】
749 5
Windows、Linux、Mac安装数据库(mysql、MongoDB、Redis)#0
|
机器学习/深度学习 数据可视化 算法框架/工具
Python小项目:利用U-net完成细胞图像分割
这个项目能够锻炼你的深度学习技能,同时也能在医学、生物等领域有实际应用。你可以参考相关的教程和资源,如 GitHub 上的 U-Net 项目,以获得更详细的指导。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
251 3