strlen函数及其模拟实现(C语言)

文章目录

  • 1.前言
  • 2. 介绍strlen函数
    • 2.1 strlen函数的作用
    • 2.2 strlen函数的原型
  • 3. strlen函数实操演练
  • 4. strlen函数的模拟实现
  • 5. 总结

1.前言

在现实生活场景中,字符乃至字符串出现的形式占大多数。比如,整天数着自己小金库里钱的数目本质上也是一种符号(数学符号),在5月20号那天说出的“5201314”也是以一种符号,等等。

那回到编程的视角中,程序员编程就是为了能够解决生活中的出现问题。如果字符和字符串出现的如此频繁,那么程序员难免要操作和处理一些字符和字符串。(在本文中,我只介绍字符串函数的一小部分)

不过不用担心,C语言在string.h这个头文件中为我们能实现了很多操作和处理字符串的函数,而在本文中,就讲解其中较为常用的一个——strlen函数

让我们开启学习之路,通往那编程辉煌的殿堂吧!🥇🥇🥇

2. 介绍strlen函数

2.1 strlen函数的作用

在前言我讲过,这是一个操作和处理字符串的函数,那么它能够生效的对象就只有字符串了,别的数据类型都不可以。(这个点是很多初学者容易犯过错误的点)。

strlen函数的功能:统计字符串中字符的个数,但不包括‘\0’。(注意:‘\0’是不算在统计个数中的,这个点也是很多人都会忽略的)

2.2 strlen函数的原型

strlen函数的原型

//strlen函数的原型
size_t strlen(const char* str)

从这个原型中,我们可以看出一些端倪。strlen函数的返回值是一个正整数,还有它的形参str是个const char*类型的变量。

可能有的读者,对这个str的变量类型有些困惑,这里我就为你解答一下:
首先,这是一个统计字符串的函数,仅仅只有统计字符串中字符的个数,不具备修改字符串内容的能力;
其次,既然我们不想修改自负床的内容,还要让这个变量接收到字符串的首地址,那么const char*这个类型就完美符合我们的要求。
希望读者们能够理解。❤️

3. strlen函数实操演练

上面接了这么多的知识了,是时候该实践出真知了。

下面是strlen函数实际使用时的代码及其运行的结果:
实例
相信大家看完这个案例后,内心就不会觉得strlen函数有多难用了。其实用这个函数时,需要注意的是包含一下string.h这个头文件即可。其他的就没什么难点了!

4. strlen函数的模拟实现

对于strlen函数的模拟实现,我将会介绍三种方法,希望读者们能够消化。👍

方法一:计数器法
先上代码,再讲思路

#include<stdio.h>
int my_strlen(char *str)
{
	int conut = 0;
	while(*str++ != '\0')
	{
		count++;
	}
	return count;
}
int main()
{
	char arr[] = "I love learning C!";
	int ret = my_strlen(arr);
	printf("%d\n",ret);
	return 0;
}

模拟实现
这里主要是分析作者写的my_strlen函数:

首先根据需求,我们要得到字符串中字符的个数,那返回值必定是一个整型。另外我们是要对字符串进行操作的,为此传给函数的字符数组,我们得设置一个字符指针来接收。为此,就有下面的代码产生
int my_strlen(char* str)
之后,就得分析函数体里面的内容了。我们都知道,字符串是以’\0’结尾的,根据这个特点我们就可以用一个while循环,循环到str指针指向’\0’之后退出循环,并且每进入一次循环体,就证明了指针指向了一个有效的数据,那么count就自增1。

如果你理解我说的话,那就太好了!接下来,讲解第二种做法。

方法二:指针 - 指针
老规矩先上代码:

#include<stdio.h>
int my_strlen(char *str)
{
	char* start = str;
	while(*str)
	{
		str++;
	}
	return str - start;
}
int main()
{
	char arr[] = "I love learning C!";
	int ret = my_strlen(arr);
	printf("%d\n",ret);
	return 0;
}

方法二
这里的解释画幅图就明白了。
图解
方法三:递归

#include<stdio.h>
int my_strlen(char *str)
{
	if(*str == '\0')
	{
		return 0;
	}
	return 1 + my_strlen(str + 1);
}
int main()
{
	char arr[] = "I love learning C!";
	int ret = my_strlen(arr);
	printf("%d\n",ret);
	return 0;
}

方法三
这个方式也是画个图你就理解了,
图解
就是把未拆分出来的字符作为一个整体,拆出来的字符就+1。

5. 总结

本文,主要的目的是要读者能够熟悉strlen函数的使用,以及当我们遇到一个陌生的函数时,如何对函数进行分析的思路。

如果你还有什么不了解的地方,欢迎在评论区提问,我会回复的!

最后,送给大家一句话。学习很难,但坚持一定很酷!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis进阶——动态SQL(1)

目录 一、 <if> 标签 二、<trim> 标签 三、<where> 标签 四、<set> 标签 五、<foreach> 标签 六、<include> 标签 动态SQL 是Mybatis的强大特性之一&#xff0c;能够完成不同条件下的不同SQL拼接&#xff0c;可以参考官方文档&#…

CNAS软件测试公司作用分享,如何获取CNAS软件测试报告?

在软件测试行业&#xff0c;CNAS认可和CNAS软件测试公司是不可忽视的关键词。CNAS认可是指中国合格评定国家认可委员会对特定领域组织、机构或公司的能力和资质进行的认可过程。该认可遵循国际标准及相关法律法规&#xff0c;是评定组织或实验室技术能力和专业水平的权威认可&a…

同时执行多个python脚本扫描,报如下错误,原因为文件越大读取到内存占用内存越多。

killed nohup python $file unable to fork process cannot allocate memory ls: error while loading shared libraries: libdl.so.2 failed to map segment from shared object cannot allocate memory python进程被系统或者某个用户通过 kill 命令强制终止了

从语言模型到全能AI:大模型跨领域应用的挑战与机遇

1、引言 在人工智能技术的浪潮中,大模型以其强大的数据处理和学习能力,从最初的语言处理领域逐步扩展到各个业务场景中,成为推动科技进步的重要力量。然而,这种跨领域应用的过程并非一帆风顺,既面临挑战也蕴含机遇。本文将通过多个业务场景案例,深入探讨大模型在跨领域应…

2023年175家中国先进封装测试厂名录涵盖华芯邦重点项目广西华芯振邦半导体集成电路晶圆级封测制造项目和山东元瓷华芯集成电路先进封装产业化项目

与传统封装相比&#xff0c;先进封装给芯片的功能拓展增加了可能性。在当前的半导体技术领域中&#xff0c;先进封装技术的重要性日益凸显&#xff0c;它对于提升半导体产品的性能、可靠性和降低成本起到了关键作用。据统计2024年共有175家中国先进封装测试厂&#xff0c; 华芯…

卓豪Zoho CRM客户管理系统采购费用?

企业如何高效地管理客户关系&#xff0c;卓豪Zoho CRM&#xff0c;作为一款领先的客户关系管理系统&#xff0c;不仅为企业提供了一套完整的客户管理解决方案&#xff0c;更在价格上实现了公开透明和合理优惠&#xff0c;助力企业实现数字化转型&#xff0c;迈向更高效、更智能…

揭秘CISA:你不知道的信息安全认证,轻松掌握职场先机!

在当今的信息化时代&#xff0c;信息系统的安全和稳定是企业和组织的重要资产。信息系统审计是一项专业的工作&#xff0c;需要具备丰富的知识和经验&#xff0c;以及敏锐的洞察力和判断力。信息系统审计师是信息系统审计领域的专业人士&#xff0c;他们负责对信息系统的设计、…

算法与数据结构高手养成:朴素的贪心法(上)最优化策略

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【放球问题 乘法原理 唯一分解定理】1735. 生成乘积数组的方案数

本文涉及知识点 【组合数学 隔板法 容斥原理】放球问题 乘法原理 唯一分解定理 本题同解 【唯一分解定理】【动态规划】【前缀和】1735生成乘积数组的方案数 LeetCode 1735. 生成乘积数组的方案数 给你一个二维整数数组 queries &#xff0c;其中 queries[i] [ni, ki] 。…

接口测试系列(一)-什么是接口测试

接口测试系列 为什么要做这个事情&#xff1f; 对自己过往在接口测试上的经验&#xff0c;写一个小结的系列文章&#xff0c;是一个系统性的思考和知识构建。发布的同时&#xff0c;也是希望获得更多感兴趣的同学的意见和反馈&#xff0c;可以把这个部分做的更好。 系列入口&…

Android Studio无法改变Button背景颜色解决办法

大家好&#xff0c;我是咕噜铁蛋&#xff01;今天我来和大家探讨一个在Android开发中常见但可能让初学者感到困惑的问题——如何在Android Studio中改变Button的背景颜色。这个问题看似简单&#xff0c;但实际操作中可能会遇到一些意想不到的挑战。接下来&#xff0c;我将从多个…

LLama学习记录

学习前&#xff1a; 五大问题&#xff1a; 为什么SwiGLU激活函数能够提升模型性能&#xff1f;RoPE位置编码是什么&#xff1f;怎么用的&#xff1f;还有哪些位置编码方式&#xff1f;GQA&#xff08;Grouped-Query Attention, GQA&#xff09;分组查询注意力机制是什么&…

金蝶云星空数据库迁移后,显示 error: 40 - 无法打开到 SQL Server 的连接的解决方法

原因&#xff1a;数据库迁移/或者更新IP后&#xff0c;与之前添加的数据库地址不一致导致无法连接数据库&#xff1b; 解决方法&#xff1a;修改IP为目前数据库的IP&#xff1b; 文件路径&#xff1a;在ManageSite\APP_Data\Common.config中&#xff0c;修改DbServerInstance…

Java实现对象存储的4种方式(本地对象存储、MINIO、阿里云OSS、FastDFS)

文章目录 Java实现对象存储的3中方式1、概述2、本地对象存储2.1 配置本地文件相关信息2.2 通用映射配置 ResourcesConfig2.3 文件上传业务 LocalSysFileServiceImpl2.4 上传接口2.5 演示 3、MINIO3.1 依赖3.2 配置3.3 配置连接信息3.4. MINIO文件上传业务3.5 文件上传下载接口3…

如何提高Linux RCU实时性

Linux RCU&#xff08;Read-Copy-Update&#xff09;是一种同步机制&#xff0c;用于提高多处理器系统中读取频繁且写入少的数据结构的性能。在实时系统中&#xff0c;响应时间和预测性是非常重要的。实时性意味着系统能够在严格的时间限制内完成任务。RCU通过减少锁的需求和允…

汇智知了堂实力展示:四川农业大学Python爬虫实训圆满结束

近日&#xff0c;汇智知了堂在四川农业大学举办的为期五天的校内综合项目实训活动已圆满结束。本次实训聚焦Python爬虫技术&#xff0c;旨在提升学生的编程能力和数据分析能力&#xff0c;为学生未来的职业发展打下坚实的基础。 作为一家在IT教育行业享有盛誉的机构&#xff…

Tensorflow2.0笔记 - AutoEncoder做FashionMnist数据集训练

本笔记记录自编码器做FashionMnist数据集训练&#xff0c;关于autoencoder的原理&#xff0c;请自行百度。 import os import time import tensorflow as tf from tensorflow import keras from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics, …

小阿轩yx-Shell编程之正则表达式与文本处理器

小阿轩yx-Shell编程之正则表达式与文本处理器 正则表达式 &#xff08;RegularExpression&#xff0c;RE&#xff09; 正则表达式概述 正则表达式的定义 又称 正规表达式常规表达式 代码中常简写为 regex、regexp 或 RE 正则表达式 使用单个字符串来描述、匹配一系列符…

如何连接SharePoint?

知行之桥EDI系统支持连接SharePoint&#xff0c;通过在成熟的SharePoint端口&#xff08;知行之桥EDI系统中的端口是指功能模块&#xff09;的可视化界面中进行简单配置&#xff0c;即可创建连接。 创建一个SharePoint 端口 本操作指南基于知行之桥EDI系统2024版&#xff0c;…

[LitCTF 2023]yafu (中级) (素数分解)

题目&#xff1a; from Crypto.Util.number import * from secret import flagm bytes_to_long(flag) n 1 for i in range(15):n *getPrime(32) e 65537 c pow(m,e,n) print(fn {n}) print(fc {c})n 152412082177688498871800101395902107678314310182046454156816957…