【C语言】三种方法模拟实现 strlen 函数

news2024/12/25 23:29:33

前言

这篇文章将要带我们去实现模拟一个stelen()函数
首先我们要知道strlen()函数的定义

strlen()定义和用法

我们先看一下strlencplusplus网站中的定义
链接: 点击跳转
在这里插入图片描述
这里我们可以知道strlen的用法

size_t strlen ( const char * str );

获取字符串长度
返回 C 字符串 str 的长度。

C 字符串的长度由终止 null 字符决定:C 字符串的长度与字符串开头和终止 null 字符之间的字符数(不包括终止 null 字符本身)一样长。

这不应与保存字符串的数组的大小相混淆。例如:

char mystr[100]=“test string”;

定义一个大小为 100 个字符的字符数组,但初始化 mystr 的 C 字符串的长度只有 11 个字符。因此,当 sizeof(mystr)的计算结果为 100 时,strlen(mystr) 返回 11。

  • 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包含 '\0' )。
  • 参数指向的字符串必须要以 '\0' 结束。
  • 注意函数的返回值为size_t,是⽆符号的
    (详细的size_t类型介绍可以看这篇文章【C语言】C\C++中的size_t类型)

这里补充一点’\0‘ASCLL码值为0

strlen()的模拟实现

知道了函数的定义和用法和上述的知识,就可以模拟实现了!

方法一:

首先我想到了第一种实现方法:

用计数器的方式实现

  • 把字符串str传入我们的模拟函数my_strlen()
  • 定义一个计数器变量count用来记录只服从长度
  • 循环遍历str(每一次count++并且str++)直到遇到‘\0'
  • 最后返回count

代码

//计数器⽅式
int my_strlen(const char * str)//这里我们不会更改str所以加上const修饰
{
 int count = 0;
 assert(str);//断言 str不为空指针
 while(*str)
 {
 count++;
 str++;
 }
 return count;
}

方法二:

那不使用计数器还有其他方法可以实现吗?
第二种方法我想到了递归

用递归的方法实现

  • 我们每次传入my_strlen()函数str+1
  • 判断*str是否为’\0‘’\0‘返回0否则返回1+my_strlen(str+1)

代码

//不能创建临时变量计数器
int my_strlen(const char * str)
{
 assert(str);
 if(*str == '\0')
 return 0;
 else
 return 1+my_strlen(str+1);
}

方法三:

那除了这两种方法还有没有别的方法呢!!
有!!
用一个指针减去另一个指针

指针-指针 方法

  • my_strlen()函数中定义一个指针p
  • p指针赋值为str
  • 循环遍历*p(每次p++
  • 这时循环结束p指针会指向字符串的最后位置(’\0'
  • p指针减去str就是用p的地址减去str的地址最后得到字符串长度

代码

//指针-指针的⽅式
int my_strlen(char *str)
{
 assert(str);
 char *p = str;
 while(*p != ‘\0)
 p++;
 return p-str;
}

如此,我们就用了三种方法去模拟实现了库函数中的strlen函数
如果有什么不足的地方,欢迎大家指正!
※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1547328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【分布式】——降级熔断限流

降级&熔断&限流 ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记仓库👉https://github.com/A-BigTree/tree-learning-notes 个人主页👉https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点…

搭建 Apple Mac M1 stm32 开发环境

近期想学习 stm32 开发,看了些书和视频,买了开发板。开发板到了后就迫不及待的的进行尝试。由于我目前使用的电脑是 Apple M1 Pro,目前用的比较多的是 windows + keil。我先是在 mac 使用虚拟机,安装 win 环境来使用,但是我分别使用了 VMware 和 parallels desktop ,keil…

机器学习笔记(4)—逻辑回归(Logistic Regression)

文章目录 逻辑回归(Logistic Regression)分类问题假说表示判定边界代价函数简化的成本函数和梯度下降多类别分类:一对多 逻辑回归(Logistic Regression) 分类问题 分类问题中,我们要预测的变量 y y y是一…

论文阅读笔记——Rethinking Pointer Reasoning in Symbolic Execution

文章目录 前言Rethinking Pointer Reasoning in Symbolic Execution12.1、基本情况概述12.2、摘要12.3、引言12.4、方法12.4.1、基本版本12.4.1.1、内存加载和存储12.4.1.2、状态合并 12.4.2、改进12.4.2.1、地址范围选择12.4.2.2、内存清理12.4.2.3、符号化的未初始化内存12.4…

RelayAttention:让大型语言模型更高效地处理长提示符

一、前言 虽然大型语言模型 (LLM) 近年来取得了非常显著的进展,也在各种自然语言处理任务中展现出强大的能力。然而,LLM 的在实际的应用落地层面也面临着一些实际挑战,其中之一就是效率和成本问题,导致了在垂直行业实际落地的应用…

网际协议 - IP

文章目录 目录 文章目录 前言 1 . 网际协议IP 1.1 网络层和数据链路层的关系 2. IP基础知识 2.1 什么是IP地址? 2.2 路由控制 3. IP地址基础知识 3.1 IP地址定义 3.2 IP地址组成 3.3 IP地址分类 3.4 子网掩码 IP地址分类导致浪费? 子网与子网掩码 3.5 CIDR与…

笔记本如何调节亮度?笔记本亮度调节方法

对于经常长时间面对笔记本电脑的小伙伴们来说,屏幕亮度过暗或者过亮,都会对眼睛造成伤害。那么,我们如何调节笔记本亮度至适中呢?下面为大家介绍3种简单的调节屏幕亮度的方法,一起来看看吧! 笔记本亮度调节方法一: 1、…

【MySQL】4.MySQL日志管理与数据库的备份和恢复

备份的目的只要是为了灾难恢复,备份还可以测试应用,回滚数据,修改和查询历史数据,审计等 日志在备份、恢复中起着重要作用 一、数据库备份的重要性 在生产环境中,数据的安全性至关重要 任何数据丢失都可能产生严重的…

关系型数据库mysql(7)sql高级语句

目录 一.MySQL常用查询 1.按关键字(字段)进行升降排序 按分数排序 (默认为升序) 按分数升序显示 按分数降序显示 根据条件进行排序(加上where) 根据多个字段进行排序 ​编辑 2.用或(or&…

centos 7 安装磐维(PanWeiDB)数据库(单机)

前置环境准备 文件系统环境要求 文件系统环境所要求的扇区必须为512bytes,查看方法如下: [rootdevops-core-highapp3-b-32 ~]#df -h /apps/ [rootdevops-core-highapp3-b-32 ~]#ll /dev/mapper/vg--docker-lvapp [rootdevops-core-highapp3-b-32 ~]#f…

Apache ActiveMQ OpenWire 协议反序列化命令执行漏洞分析 CVE-2023-46604

Apache ActiveMQ 是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。 OpenWire协议在ActiveMQ中被用于多语言客户端与服务端通信。在Apache ActiveMQ 5.18.2版本及以前&#xff0…

小程序富文本图片宽度自适应

解决这个问题 创建一个util.js文件,图片的最大宽度设置为100%就行了 function formatRichText(html) {let newContent html.replace(/\<img/gi, <img style"max-width:100%;height:auto;display:block;");return newContent; }module.exports {formatRichT…

2024-03-26 Android8.1 px30 WI-FI 模块rtl8821cu调试记录

一、kernel 驱动&#xff0c;我这里使用v5.8.1.2_35530.20191025_COEX20191014-4141这个版本&#xff0c;下载这个版本的驱动可以参考下面的文章。 2021-04-12 RK3288 Android7.1 USB wifi bluetooth 模块RTL8821CU 调试记录_rk平台rtl8821cu蓝牙调试-CSDN博客 二、Makefile文…

基于nodejs+vue考试信息报名系统python-flask-django-php

本文拟采用nodejs技术和express 搭建系统框架&#xff0c;后台使用MySQL数据库进行信息管理&#xff0c;设计开发的考试信息报名系统。通过调研和分析&#xff0c;系统拥有管理员、学生和教师三个角色&#xff0c;主要具备登录注册、个人信息修改、对系统首页、个人中心、学生管…

在项目中数据库如何优化?【MySQL主从复制(创建一个从节点复制备份数据)】【数据库读写分离ShardingJDBC(主库写,从库读)】

MySQL主从复制 MySQL主从复制介绍MySQL复制过程分成三步&#xff1a;1). MySQL master 将数据变更写入二进制日志( binary log)2). slave将master的binary log拷贝到它的中继日志&#xff08;relay log&#xff09;3). slave重做中继日志中的事件&#xff0c;将数据变更反映它自…

JS等比压缩图片方法

AI给出来的答案&#xff0c;AI真的能改变世界&#xff0c;以后程序员这个职业真的有可能不存在了。 function compressImage(image, callback) {// 创建一个 canvas 元素const canvas document.createElement(canvas);canvas.width 48;canvas.height 48;// 获取 canvas 的绘…

【学海拾贝】| 关于Python的 PEP 484规则了解:类型提示,函数注解

在实际的工厂在实际的工程代码的开发中&#xff0c;常常可以碰到这种情况 上网查了之后发现这是PEP484规则~ 文章目录 1 Type Hints for Variables&#xff08;变量在这里插入图片描述2 Function Annotations&#xff08;函数注解&#xff09;3 Type Checking Tools&#xff08…

【比特币】比特币的奥秘、禁令的深层逻辑与风云变幻

导语&#xff1a; 比特币(Bitcoin)&#xff0c;这个充满神秘色彩的数字货币&#xff0c;自诞生以来便成为各界瞩目的焦点。它背后所蕴含的Mining机制、禁令背后的深层逻辑以及市场的风云变幻&#xff0c;都让人欲罢不能。今天&#xff0c;我们将深入挖掘比特币的每一个角落&…

视觉图像处理与FPGA实现第七次作业——生成512深度、8位宽度的双端口存储器IP,并分析IP包资料构成

一、生成IP 打开Vivado&#xff0c;点击IP Catalog&#xff0c;搜索memory&#xff0c;双击对应IP核 调整参数为——512深度、8位宽度&#xff0c;双端口&#xff0c;然后一直默认点击OK 二、分析IP构成 查看IP细节&#xff0c;查看设计资源和仿真资源 双击打开文件 设计文件…

代码随想录 图论-并查集

代码随想录 (programmercarl.com) 寻找图中是否存在路径这道题中的类可看做并查集的标准类 目录 1971.寻找图中是否存在路径 684.冗余连接 685.冗余连接II 1971.寻找图中是否存在路径 1971. 寻找图中是否存在路径 已解答 简单 相关标签 相关企业 有一个具有 n 个顶…