【C语言】自定义实现strlen函数的3种方法

news2025/1/12 3:52:38

大家好,我是苏貝,本篇博客带大家了解C语言中自定义实现strlen函数的3种方法,如果大家觉得我写的不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


在自定义实现strlen函数之前,我们简单的介绍一下strlen函数。strlen的功能就是求字符串长度。它只能作用于字符串,是C语言中的库函数,使用时要引用 < string.h> 这个头文件。每个字符串结尾处都隐藏有 ‘\0’ ,它是字符串的结束标志,所以我们在用strlen函数求字符串长度时,遇见 ‘\0’ 时就停止读取字符串,字符串长度为 ‘\0’ 之前的字符个数,不包括 ‘\0’ 。若想更详细地了解strlen函数,请点击该链接

简单介绍strlen函数之后,让我们开始正文


1.计数器

这是3种方法里面最简单的一种,只用将数组作为函数参数,再用计数器i充当数组下标,若arr[i]不是转义字符 ‘\0’ ,i++;直到为 ‘\0’ 时,返回计数器i

int my_strlen(char arr[])
{
	int i = 0;
	while (arr[i] != '\0')
	{
		i++;
	}
	return i;
}

int main()
{
	char arr[] = "abcdefg";//abcdefg\0
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}
//7

2.递归(不用创造临时变量)

将数组作为函数实参,实际上传过去的是数组首元素地址,用指针接收变量str接收,对str进行解引用操作找到str指向的字符,若该字符为 ‘\0’ ,则返回0;否则返回1+my_strlen(str + 1),再进入my_strlen函数时,str指向下一位,继续上述判断。

例如:若下面代码中char arr[ ]=“ab”,将数组名arr作为函数实参,用指针str接收,此时str指向数组首元素即字符a。对指针str进行解应用str=a,a!= ‘\0’ ,所以函数返回1+my_strlen(str + 1),再进行下一次递归, 此时str指向下一位字符b。对指针str进行解应用str=b,b!= ‘\0’ ,所以函数返回1+my_strlen(str+1),再进行下一次递归, 此时str指向下一位字符 ‘\0’ 。对指针str进行解应用*str= ‘\0’ ,所以函数返回0,接着返回上一次递归,此时str指向字符b,my_strlen(str + 1) 的结果为0,所以1+my_strlen(str + 1)的结果=1并再将1返回上一次递归。此时str指向字符a,my_strlen(str + 1)的结果=1,所以1+my_strlen(str + 1)结果=2,将2作为最后的值返回。

int my_strlen(char* str)
{
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}

int main()
{
	char arr[] = "abcdefg";//abcdefg\0
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}

3.指针(指针-指针的差值的绝对值是它们之间的元素个数)
若想详细了解 指针-指针,请点击该链接

思想:只要最后指针str指向的是 ‘\0’ ,指针start指向的是数组首元素a,那么str - start就是字符串长度
创建指针变量start存放数组首元素地址(str就是数组首元素地址),再用while循环使得str最后指向 ‘\0’ ,返回两指针的差值

int my_strlen(char* str)
{
	char* start = str;
	while (*str != '\0')
	{
		str++;
	}
	return str - start;
}

int main()
{
	char arr[] = "abcdefg";
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}

好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

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

相关文章

2023 年第八场牛客多校题解

A Alive Fossils 题意&#xff1a;依次举办 n n n 场多校&#xff0c;每场多校有一些出题人。问哪些出题人每场都出题了。 解法&#xff1a;用 set 维护下一直在出题的人即可。 B Bloodline Counter 题意&#xff1a;求 n n n 个点的竞赛图中最大环大小恰好为 k k k 的方…

【国赛清单】2023全国大学生电赛综合测试【总结】

综合测评简介 &#xff08;1&#xff09;综合测评是全国大学生电子设计竞赛评审工作中非常重要的一个环节&#xff0c;是“一次竞赛二级评审”工作中全国专家组评审工作的一部分。 &#xff08;2&#xff09;测试对象为赛区推荐上报全国评奖的优秀参赛队全体队员&#xff0c;…

找不到资产文件project.assets.json

NuGet 在“obj”文件夹中写入名为 project.assets.json 的文件&#xff0c;.NET SDK 使用该文件来获取有关要传递到编译器的包的信息 。 如果在生成过程中找不到资产文件 project.assets.json&#xff0c;则会发生此错误。 1.执行命令的方式解决 点击工具&#xff0c;分别展开命…

实例 -- Loadrunner实现Android / IOS 手机APP压力测试

随着手机APP用户量的增大&#xff0c;大的手机APP一般都需要进行压力测试&#xff0c;这几天用了Loadrunner 12进行了手机APP的压力测试&#xff0c;整理了下&#xff0c;大家可以参考参考怎样给Andorid / IOS手机APP进行压力测试&#xff0c;以下是操作实例。 先前我的一个帖…

论文浅尝 | CI4MRC:基于因果推断去除机器阅读理解中的名字偏差

笔记整理&#xff1a;朱珈徵&#xff0c;天津大学硕士&#xff0c;研究方向&#xff1a;问答 链接&#xff1a;https://aclanthology.org/2023.findings-acl.812/ 动机 机器阅读理解&#xff08;Machine Reading Comprehension&#xff0c;MRC&#xff09;是根据给定的文章回答…

linux 命令- systemctl

systemctl 参数说明 1、使用语法 用法&#xff1a;systemctl [OPTIONS…] {COMMAND} … 2 、参数说明 参数参数说明start立刻启动后面接的unitstop立刻关闭后面接的unitrestart立刻关闭后启动后面接的unit&#xff0c;亦即执行stop再start的意思reload不关闭后面接的unit的…

从零开始实现一个玩具版浏览器渲染引擎

前言 浏览器渲染原理作为前端必须要了解的知识点之一&#xff0c;在面试中经常会被问到。在一些前端书籍或者培训课程里也会经常被提及&#xff0c;比如 MDN 文档中就有渲染原理的相关描述。 作为一名工作多年的前端&#xff0c;我对于渲染原理自然也是了解的&#xff0c;但是…

HCIP学习--BGP1

目录 BGP是什么 AS EGP协议 IGP协议 EGP和IGP的区别 IGP协议追求 EGP协议的追求 BGP协议 BGP的特性 可靠性 可控性强 AS-BY-AS 具有丰富的属性来取代IGP中度量进行选路 默认不被用于负载均衡 不需要周期更新 无类别路径矢量 BGP数据包 Open Keeplive Update…

MIMO-NOMA系统MATLAB仿真实现

非正交多址接入&#xff08;NOMA&#xff09;技术可以打破传统的正交多址一个基本资源块由单用户独占的限制&#xff0c;通过在时域和频域的基础上开辟新的功率域维度&#xff0c;在相同的时频资源上通过功率复用技术允许同一个时频资源块由多个用户共享&#xff0c;有效提升了…

树莓派使用 ENC28J60

前言 一些老的、Mini 的 ARM 开发板上没有预留网口&#xff0c;这样在调试升级内核或应用程序时很不方便。纵使有串口下载工具&#xff0c;但其速度也是慢地捉急。这种情况下&#xff0c;使用其它接口来扩展出一个网口无疑是一个比较好的方法。 ENC28J60 就是一个使用 SPI 接口…

软件测试基础篇——MySQL

MySQL 1、数据库技术概述 数据库database&#xff1a;存放和管理各种数据的仓库&#xff0c;操作的对象主要是【数据data】&#xff0c;科学的组织和存储数据&#xff0c;高效的获取和处理数据SQL&#xff1a;结构化查询语言&#xff0c;专为**关系型数据库而建立的操作语言&…

LabVIEW开发图像采集和基于颜色的隔离

LabVIEW开发图像采集和基于颜色的隔离 在当今的工业和工厂中&#xff0c;准确性和精度是决定特定行业生产力的两个重要关键点。为了优化生产力&#xff0c;各行各业正在从手动操作转向自动操作和控制。机器人技术在工业过程中的出现为人类提供了机械辅助。机器视觉在工业机器人…

LinuxC编程——线程的同步与互斥

目录 一、同步的概念二、同步机制2.1 信号量2.1.1基础概念2.1.2 函数接口2.1.3 例子 2.2 互斥锁2.2.1 几个概念2.2.2 函数接口2.2.3 练习 2.3 条件变量2.3.1 步骤2.3.2 函数2.3.3 练习 我们知道&#xff0c;一个进中的所有线程共享进程的资源&#xff0c;所以可以通过在进程中定…

【概念篇】文件概述

✅作者简介&#xff1a;大家好&#xff0c;我是小杨 &#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; 文件概述 1&#xff0c;文件的概念 狭义上的文件是计算机系统中用于存储和组织数据的一种数据存…

大华智慧园区综合管理平台文件上传漏洞复现(HW0day)

0x01 产品简介 “大华智慧园区综合管理平台”是一款综合管理平台&#xff0c;具备园区运营、资源调配和智能服务等功能。平台意在协助优化园区资源分配&#xff0c;满足多元化的管理需求&#xff0c;同时通过提供智能服务&#xff0c;增强使用体验。 0x02 漏洞概述 大华智慧园…

PowerShell 使用SqlScriptDOM对T-SQL做规则校验

对于数据项目来说&#xff0c;编写Sql是一项基本任务同时也是数量最多的代码。为了统一项目代码规范同时降低Code Review的成本&#xff0c;因此需要通过自动化的方式来进行规则校验。由于本人所在的项目以SQL Server数据库为基础&#xff0c;于是本人决定通过使用SqlScriptDom…

静态库和动态库制作

文章目录 前言一、静态库和动态库介绍1、静态库2、动态库 二、静态库的制作及使用1、准备好源码2、编译源码生成 .o 文件3、制作静态库4、使用静态库 三、动态库的制作及使用1、生成位置无关的 .o 文件2、制作动态库3、使用动态库4、指定动态库路径并使其生效 四、对比1、静态库…

初步制作做一个AI智能工具网站,持续更新

文章目录 介绍AI对话AI绘画AI音视频AI图片处理AI小工具体验 介绍 网页有五大部分&#xff1a;AI对话、AI绘画、AI音视频、AI 图片处理、AI小工具。 AI对话 AI对话是指人工智能技术在模拟人类对话交流方面的应用。通过使用自然语言处理和机器学习算法&#xff0c;AI对话系统可…

Flink CDC系列之:基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL

Flink CDC系列之&#xff1a;基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL 一、技术路线二、MySQL数据库建表三、PostgreSQL数据库建表四、在 Flink SQL CLI 中使用 Flink DDL 创建表五、关联订单数据并且将其写入 Elasticsearch 中六、Kibana查看商品和物流信息的…

基于Java+SpringBoot+Vue的书籍学习平台设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…