13. 《C语言》——【strlen函数的使用和模拟实现】

文章目录

  • 前言
  • strlen函数
    • strlen函数的使用
    • strlen函数的3种方法实现
      • 方法1
      • 方法2
      • 方法3
  • 总结


在这里插入图片描述


前言

	各位老板好~ , 今天我们讲解strlen函数如何去使用以及如何去模拟实现strlen函数。希望各位老板能够给一个点赞和一个大大的关注,感谢各位老板!

strlen函数


strlen函数的使用

在库函数中,strlen函数的功能是求出字符串的长度,统计的是字符串中\0之前的字符个数。

函数原型如下:

size_t strlen ( const char * str );

使用strlen函数,需要包含头文件:

#include<string.h>

使用代码如下:

//strlen函数的使用
#include<string.h>
#include<stdio.h>
int main()
{char arr[] = "zhangsan"; size_t len = strlen(arr); printf("%zd\n", len); return 0; 
}

运行结果:

在这里插入图片描述

分析:

  1. 值得注意的是strlen函数的返回值是size_t,也就是返回无符号整型,那么对应的占位符使用%zd。
  2. const char * str , 接收的是数组首元素的地址。
  3. 使用库函数,不要忘记包含对应的头文件。

strlen函数的3种方法实现


方法1

方法1,我们使用计数器方法,那么大概思路就是,我有一个指针变量p,它指向的是这个数组,指针变量p++,只要p指向的不是’\0’,那么我的计数器count++。


代码如下:

//strlen函数的模拟实现 
//方法1(计数器) 
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* p)
{int count = 0; //计数器assert(p != NULL); while (*p != '\0')//只要*p不等于'\0' , count就++{count++; p++; }return count; 
}
int main()
{char arr[] = "zhangsan"; size_t len = my_strlen(arr); printf("%zd\n", len); return 0; 
}

运行结果:

在这里插入图片描述

分析:

  1. 为了完成strlen函数的模拟,我们自己写了一个函数:my_strlen。首先,函数进行传参(数组传参传的是数组首元素的地址)。其次,创建变量len来接收值。最后打印该值。
  2. 进入函数里面,我们该如何去写? 既然传递的是地址,那么我们需要使用指针来接收,为了不想让值被修改,我们可以加上const的修饰指针。返回类型我们就按照strlen函数的一样就可以。
  3. 然后,既然是使用计数器方法,我们就创建一个计数器count。在其之前,我们可以使用assert函数断言一下,判断一下我们的指针是不是空指针,如果是会报出错误,使用assert,需要包含对应的头文件。
  4. 我们需要遍历数组元素,如果指针*p不是’\0’,那么计数器count++,最终,返回count就可以;如果是’\0’,直接结束。

方法2

方法二,我们使用指针-指针的方法。也就是让指针末-指针首就可以得到中间值,指针-指针必须是在同一内存空间。


代码如下:

//strlen函数的模拟实现 
//方法2(指针-指针) 
#include<stdio.h> 
#include<assert.h>
size_t my_strlen(const char* p)
{assert(p != NULL); const char* start = p; const char* end = p;   while (*end != '\0'){end++; }return end - start; }
int main()
{char arr[] = "abcdefg";  size_t len = my_strlen(arr);  printf("%zd\n", len);return 0; 
}

运行结果:

在这里插入图片描述

分析:

  1. 创建一个字符数组,值为"abcdefg" , 随后,创建一个函数叫my_strlen,对它进行传参。创建len来接收my_strlen的值,最后打印该值。
  2. 进入函数内部,因为my_strlen传递的是数组首元素的地址,我们需要使用指针p来接收,并且使用const修饰指针p。my_strlen的返回类型是size_t。
  3. assert断言一下指针变量是不是为空,使用assert需要包含头文件。创建2个新的指针变量,分别为start和end,把p赋值给这2个指针变量。随后进行遍历,如果不是’\0’,end++。最后,end - start 也就是指针-指针,并且返回。

方法3

我们使用递归来解决,那么如何去使用递归?我们知道,使用递归需要遵循2个前提

  1. 递归存在限制条件,当满足这个限制条件时,递归就不再继续
  2. 每一次递归,都会接近限制条件

当我们了解了这2个前提,那么我们就可以使用递归了。


代码如下:

//strlen函数的模拟实现 
//方法3(递归) 
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* p)
{assert(p != NULL); if (*p != '\0')return 1 + my_strlen(p + 1);elsereturn 0;
}
int main()
{char arr[] = "abcdefg"; size_t len = my_strlen(arr); printf("%zd\n", len); return 0; 
}

运行结果:

在这里插入图片描述

分析:

  1. 创建字符数组,并且进行初始化;写一个函数my_strlen,创建一个变量len,接收值。最后,打印值。
  2. 进入函数内部,既然传递的是数组首元素的地址,我们就创建指针变量p来接收,我们不想让值进行改变,使用const修饰指针变量。my_strlen函数的返回类型与strlen函数一致,为size_t 。
  3. 使用assert断言一下,确保p不是空指针。使用assert需要保证包含头文件。
  4. 在前面,我们说了递归的使用方法,需要有一个限制条件,那么如果p不等于’\0’,就进行递归,否则,else 返回0。

总结

  1. 以上就是本文章的内容,我们使用了3个方法来模拟strlen函数。
  2. 感谢大家的阅读,希望能够给一个大大的关注~
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【翻译软件】CopyTranslator复制即翻译的外文辅助阅读翻译软件NO.102

使用平台&#xff1a;Windows/Linux/macOS 设置里选择翻译引擎和翻译API&#xff0c;谷歌翻译已经退出中国了&#xff0c;但还是提供了镜像地址 一、复制即翻译 只需要复制文本到剪贴板&#xff0c;就可以查看翻译结果 记得开启“自动粘贴”哦。 二、多段同时翻译 三、智能…

第二证券炒股知识:短线炒股技巧?

在股票商场上&#xff0c;出资者分为长线和短线这两大类&#xff0c;其中短线炒股存在以下技巧&#xff1a; 1、早盘集合竞价时刻上的技巧 早上集合竞价对短线出资者来说比较重要&#xff0c;其中早上集合竞价期间9&#xff1a;15-9:20之间出资者可以进行撤单操作&#xff0c…

新项目来了,JDK 17和JDK 21 该如何选择?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【机器学习数据挖掘】基于ARIMA 自回归积分滑动平均模型的销售价格库存分析报告 附完整python代码

资源地址&#xff1a;Python数据分析大作业 4000字 图文分析文档 销售分析 完整python代码 ​ 完整代码分析 同时销售量后1000的sku品类占比中&#xff08;不畅销产品&#xff09;如上&#xff0c;精品类产品占比第一&#xff0c;达到66.7%&#xff0c;其次是香化类产品&#…

【mysql】ssl_choose_client_version:unsupported protocol

起因&#xff1a;项目上的DolphinScheduler连接不上数据库&#xff0c;查看worker日志提到SSL协议问题&#xff1a; com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failureCaused by: java.io.EOFException: SSL peer shut down incorrectly 我…

SQL Developer 导入CSV数据

之前已经写过一篇文章&#xff1a;将文本文件导入Oracle数据库的简便方法&#xff1a;SQL Developer 本文是类似的&#xff0c;只不过使用的是官方提供的 CSV文件&#xff0c;确实是标准的CSV&#xff08;comma separated values&#xff09;。 COL1,COL2,COL3 "e40a9db…

记录岁月云明细账excel导出的性能优化

财务软件报表还是非常麻烦&#xff0c;因为使用excel最好的就是财务&#xff0c;但是通过java导出excel&#xff0c;使用easyexcel不用报表工具&#xff0c;不是这么容易。采用jprofile对一个导出操作进行监控&#xff0c;其中一家零售企业导出当月全部明细账&#xff0c;检测到…

Spark的性能调优——RDD

前言 RDD 是 Spark 对于分布式数据集的抽象&#xff0c;每一个 RDD 都代表着一种分布式数据形态。比如 lineRDD&#xff0c;它表示数据在集群中以行&#xff08;Line&#xff09;的形式存在&#xff1b;而 wordRDD 则意味着数据的形态是单词&#xff0c;分布在计算集群中。 参…

使用 Django Channels 构建实时聊天应用(包含用户认证和消息持久化)

文章目录 准备工作创建 Django 项目创建应用程序配置项目编写 Consumer编写路由创建 URL 路由运行应用用户认证消息持久化显示历史消息结论 Django Channels 是 Django 的一个扩展&#xff0c;允许在 Web 应用中添加实时功能&#xff0c;例如 Websockets、HTTP2 和其他协议。本…

图片在线改dpi如何操作?电脑上改图片dpi的简单技巧

对图片dpi有数值的要求&#xff0c;需要将图片分辨率调整到要求的数值才可以上传。对于图片尺寸大小修改的方法相信很多人都知道如何处理&#xff0c;那么图片dpi的数值的修改方法是什么样的呢&#xff1f;下面就来给大家分享一下修改dpi数值的具体操作技巧。 在电脑上打开压缩…

推荐ChatGPT4.0——Code Copilot辅助编程、Diagrams: Show Me绘制UML图、上传PDF并阅读分析

5月14日凌晨1点、太平洋时间的上午 10 点&#xff0c;OpenAI的GPT-4o的横空出世&#xff0c;再次巩固了其作为行业颠覆者的地位。GPT-4o的发布不仅仅是一个产品的揭晓&#xff0c;它更像是向世界宣告AI技术已迈入了一个全新的纪元&#xff0c;连OpenAI的领航者萨姆奥特曼也不禁…

MFC 使用sapi文字转换为语音

文章目录 添加头文件声明变量 添加头文件 声明变量 pSpVoice NULL; //默认构造函数中初始化为空 bool CChKBarSCCodeApp::InitSpVoice() {HRESULT hr ::CoInitialize(NULL); // COM初始化if (!SUCCEEDED(hr)){AfxMessageBox(_T("声音环境初始化失败&#xff01;…

《科技和产业》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《科技和产业》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊 问&#xff1a;《科技和产业》是什么级别的&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国科学技术协会 主办单位&…

Android电量优化,让你的手机续航更持久

节能减排&#xff0c;从我做起。一款Android应用如果非常耗电&#xff0c;是一定会被主人嫌弃的。自从Android手机的主人用了你开发的app&#xff0c;一天下来&#xff0c;也没干啥事&#xff0c;电就没了。那么他就会想尽办法找出耗电量杀手&#xff0c;当他找出后&#xff0c…

【Unity】使用Jenkins实现远程Unity打包

前言 很多时候&#xff0c;我们需要自动打包&#xff0c;比如下班了&#xff0c;我要出一个包明天早上用。比如每天夜里12点&#xff0c;我需要定时出一个稳定包。 这个时候就需要Jenkins了。 1.安装环境 安装 jenkins 之前&#xff0c;需要安装Java 。Java下载网站 ①下载…

tomcat-memcached会话共享配置

目录 1、安装memcache服务 2、把依赖的jar包移至tomcat/lib目录下 3、配置tomcat/conf/context.xml 4、重启tomcat服务 1、安装memcache服务 具体安装步骤此处不详细说明&#xff0c;自行根据实际情况安装即可 2、把依赖的jar包移至tomcat/lib目录下 3、配置tomcat/conf/c…

【python】OpenCV—Merge Image

文章目录 np.hstack / np.vstackSlicecv2.addWeighted自定义渐变式叠加cv2.bitwise_not / cv2.bitwise_and / cv2.add np.hstack / np.vstack 利用 numpy 的 hstack 和 vstack&#xff0c;对图片进行拼接 import cv2 import numpy as nph, w 256,256 img1 cv2.resize(cv2.i…

零基础python爬虫从入门到精通

零基础python爬虫从入门到精通 课程介绍学习地址下期更新预报 课程介绍 本套视频教程适合想掌握爬虫技术的学习者&#xff0c;以企业主流版本Python 3.7来讲解&#xff0c;内容包括&#xff1a;Python基础、Urllib、解析&#xff08;xpath、jsonpath、beautiful&#xff09;、…

初级网络工程师之入门到入狱(一)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、交换机二、路由器三、DHCP&#xff08;动态主机配置协议&#xff09;四、路由器配置 DHCP自…

java多线程初探

文章目录 countDownLatchvolatileCASjdk1.6对synchronized的优化自旋锁锁消除锁粗化轻量级锁偏向锁 java AtomicBoolean compareAndSet Demothreadlocalconcurrent queue原子操作是否需要同步copyonwrite容器可重入锁公平与非公平并发编程步骤 countDownLatch 此类位于java.ut…