字符串函数的模拟实现(strlen,strcpy,strcat,strcmp,strstr)(图文并茂,清晰易懂)

news2024/12/23 20:05:11

目录

  • 1. strlen函数
  • 2. strcpy函数
  • 3. strcat函数
  • 4. strcmp函数
  • 5. strstr函数

个人专栏

《零基础学C语言》

1. strlen函数

strlen函数(Get string length)的功能是求字符串长度

使用注意事项

  1. 字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
  2. 参数指向的字符串必须要以 ‘\0’ 结束。
  3. 注意函数的返回值为size_t,是无符号的(易错

在这里主要讲解三种方法模拟实现

  • 方法一
  • 计数器
size_t my_strlen1(const char* str)
{
	assert(str);
	int count = 0;

	while (*str++)
	{
		count++;
	}

	return count;
}
  • 方法二
  • 指针-指针
  • 得到的是中间元素的个数

这里我们要记录下字符串的初始位置,等str移动到 ‘\0’ 后,相减得结果

size_t my_strlen2(const char* str)
{
	assert(str);
	char* start = str;

	while (*str)
	{
		str++;
	}

	return str - start;
}
  • 方法三
  • 递归

递归主要考虑返回条件子问题

  1. 返回条件:如果str指向 ‘\0’ ,则返回0
  2. 子问题:转化为求my_strlen(str+1) (除去本身字符的字符串)+ 1(本身字符)
size_t my_strlen3(const char* str)
{
	assert(str);

	if (*str == '\0')
	{
		return 0;
	}

	return my_strlen3(str + 1) + 1;
}

运行结果:

void TestMyStrlen()
{
	char arr[] = "abcdef";
	size_t len = my_strlen3(arr);
	printf("%zd\n", len);
}

2. strcpy函数

strcpy函数(Copy string)的功能是字符串拷贝

  • 将源字符串拷贝到指定空间

使用注意事项

  1. 源字符串必须以 ‘\0’ 结束。
  2. 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  3. 目标空间必须足够大,以确保能存放源字符串。
  4. 目标空间必须可修改。
  5. 返回值是目标空间的地址

下面代码最巧妙的地方,在于把字符串的拷贝和 ‘\0’ 的拷贝融合在一起。循环中,先赋值,再判断,最后++。这样就算遇到 ‘\0’ ,也会先拷贝,再判断停止。

char* my_strcpy(char* dst, const char* src)
{
	assert(dst && src);
	char* ret = dst;

	while (*dst++ = *src++)
	{
		;
	}

	return ret;
}

运行结果:

3. strcat函数

strcat函数(Concatenate strings)的功能是字符串追加

  • 将一段字符串追加到另一段字符串后面

使用注意事项

  1. 源字符串必须以 ‘\0’ 结束。
  2. 目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。
  3. 目标空间必须有足够的大,能容纳下源字符串的内容。
  4. 目标空间必须可修改。
  5. 返回值是目标空间的地址

字符串追加可以理解为两个过程:

  1. 找到目标字符串末尾的 ‘\0’
  2. 开始追加(其实就是字符串拷贝)
char* my_strcat(char* dst, const char* src)
{
	assert(dst && src);
	char* ret = dst;

	while (*dst)
	{
		dst++;
	}

	while (*dst++ = *src++)
	{
		;
	}

	return ret;
}

运行结果:

4. strcmp函数

strcmp函数(Compare two strings)的功能是字符串比较

  • 比较两个字符串是否相等
  • 如果相等,则返回0
  • 那么如何判断两个字符串? 比较两个字符串中对应位置上字符ASCII码值的大小。

使用注意事项

  1. 不是比较两个字符串的长度(极其易错
  2. 一般我只用来判断两个字符串是否相等,至于不相等时,比较字符之间大小,我感觉还没遇到很好的应用
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);

	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}

		str1++;
		str2++;
	}

	return *str1 - *str2;
}

运行结果:



5. strstr函数

strstr函数(Locate substring)的功能是查找子串

  • 在字符串str1中查找是否存在与str2相等的子串
  • 如果存在,则返回该地址(返回字符串str2在字符串str1中第⼀次出现的位置)
  • 如果不存在,则返回空指针

使用注意事项

  1. 如果要查找的子串为空串,则直接返回str1的地址

我们这里采用最直观,容易理解的暴力求解法

  1. 额外设立cur,dst,src三个指针
  2. 如果子串为空,则直接返回str1
  3. 如果str1为空,则直接返回NULL
  4. 如果不满足以上情况,则进入大循环:每次循环开始,让dst指向cur所在的位置,src指向str2(子串)
  5. 如果*dst == *src,则继续向后比较;如果不相等,则跳出小循环,判断src是否为 ‘\0’,如果为 ‘\0’ ,则代表匹配成功,返回地址cur
  6. 如果不为 ‘\0’,则代表当前位置往后没有可匹配的项,则cur++,继续重复以上循环
  7. 若以上循环结束,还没有找到对应子串,则返回NULL

是不是光看文字还不理解,我们来看图分析

首先,(假设dst是s1,src是s2),cur从a开始,s1和s2比较,不相等,再判断s2是否为’\0’,不为0,则cur++

cur再从b开始比较,s1和s2相等,则继续比较

直到s1和s2不相等,再判断s2是否为’\0’,不为0,则cur++

cur再从下一个b开始,同样重复以上步骤……

s2还是不为0,cur++

cur从第三个b开始,s1和s2比较。

这次,直到s1和s2不相等时,s2终于为’\0’,则代表匹配成功,返回地址cur!!!

//暴力求解
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	const char* cur = str1;
	const char* dst = NULL;
	const char* src = NULL;

	if (*str2 == '\0')
	{
		return (char*)str1;
	}

	while (*cur)
	{
		dst = cur;
		src = str2;

		while (*dst == *src)
		{
			dst++;
			src++;
		}

		if (*src == '\0')
		{
			return (char*)cur;
		}

		cur++;
	}

	return NULL;
}

运行结果:



这种暴力求解的方法比较好理解,但效率却不是很高。其实还有一种高效求子串的方法——KMP算法,在后期会跟大家进行详细讲解。

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

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

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

相关文章

如何预防数据泄露?六步策略帮您打造企业信息安全壁垒

大家好!我是恒小驰,今天我想和大家聊聊一个非常重要的话题——如何预防数据泄露。在这个数字化的时代,数据已经成为了我们生活中不可或缺的一部分。然而,随着数据的价值日益凸显,数据泄露的风险也随之增加。企业应该如…

windows电脑定时开关机设置

设置流程 右击【此电脑】>【管理】 【任务计划程序】>【创建基本任务】 gina 命令 查看 已经添加的定时任务从哪看?这里: 往下滑啦,看你刚才添加的任务:

Lora学习资料汇总

目录 LoRa联盟 Semtech lora网关供应商: LoRaMAC API文档 论坛 开发板 主流技术对比分析 LoRa网络距离模拟测试方法 LoRa应用 Lora LoraWAN教程 LoRa联盟 LoRa联盟:LoRaWAN规范的制定组织 https://www.lora-alliance.org/ LoRa技术白皮书:htt…

计算机毕业设计项目选题推荐(免费领源码)java+springboot+mysql 城市房屋租赁管理系统01855

摘 要 本论文主要论述了如何使用springboot 城市房屋租赁管理系统 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构JAVA技术,面向对象编程思想进行项目开发。在引言中,作者将论述城市房屋租赁管理系统的当前背景以及…

SAP指针Field-Symbols:<FS>用法及实例

指针Field-Symbols:用法 内部字段定义 : FIELD-SYMBOLS: [TYPE>] 一、在ABAP编程中使用非常广泛,类似于指针,可以指代任何变量。 当不输入时,继承赋给它的变量的所有属性 当输入时,赋给它的变量必须与同类型。 举个简…

一文带你了解多文件混淆加密

目录 🔒 一文带你了解 JavaScript 多文件混淆加密 ipaguard加密前 ipaguard加密后 🔒 一文带你了解 JavaScript 多文件混淆加密 JavaScript 代码多文件混淆加密可以有效保护源代码不被他人轻易盗取。虽然前端的 JS 无法做到纯粹的加密,但通…

Grails 启动

Grails系列 Grails项目启动 文章目录 Grails系列Grails一、项目创建二、可能的问题1.依赖下载2.项目导入到idea失败3.项目导入到idea后运行报错 Grails Grails是一款基于Groovy语言的Web应用程序框架,它使用了许多流行的开源技术,如Spring Framework、…

技术部工作职能规划分析

前言 技术部的职能。以下是一个基本的框架,其中涵盖了技术部在公司中的关键职能和子职能。 主要职能 技术部门的主要职能分为以下几个板块: - 技术规划与战略: 制定技术规划和战略,与业务团队合作确定技术需求。 研究和预测技术趋势,引领公司在技术创新和数字化转型方…

外网讨论疯了的神秘模型Q*(Q-Star)究竟是什么?OpenAI的AGI真的要来了吗 | 详细解读

大家好,我是极智视界,欢迎关注我的公众号,获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 这几天,…

分布式篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、什么是补偿事务?二、消息队列是怎么实现的?三、那你说说Sagas事务模型前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。…

c语言新龟兔赛跑

以下是一个使用C语言编写的新的龟兔赛跑游戏&#xff1a; #include <stdio.h>#include <stdlib.h>#include <time.h>int main() { int distance, turtle_speed, rabbit_speed, turtle_time, rabbit_time, rabbit_lead; srand(time(NULL)); // 随机数种…

F盘满了变成红色怎么清理?这4个简单方法记得收藏!

“因为我电脑的磁盘比较多&#xff0c;我通常会把一些比较重要的文件放在F盘中。但是很奇怪&#xff0c;我的F盘用着用着就满成红色了&#xff0c;这该怎么办呢&#xff1f;应该怎么进行清理呢&#xff1f;” 我们在使用电脑时都会发现&#xff0c;电脑上有很多的磁盘。我们可以…

企业数字化转型转什么?怎么转?这份攻略请收好

目录 -01-数字化转型“是什么” -02-数据驱动推动企业数字化转型 -03-企业数字化转型的行动路线图 数字化转型&#xff0c;转什么&#xff1f;怎么转&#xff1f;这些问题仍在困扰不少企业&#xff0c;也是每个企业转型升级不得不思考的重要问题。对此&#xff0c;中关村数字…

SQL语句的用法

目录 关系统型数据库相 联系类型 数据库的正规化分析 第一范式&#xff1a;1NF 范式主要就是减产冗余 第二范式&#xff1a;2NF 第三范式&#xff1a;3NF 字符串(char,varchar,text) char和varchar的比较&#xff1a; 修饰符&#xff0c; 主键&#xff0c;唯一键 常见…

干货!ERP软件如何帮助企业实现信息化管理?

ERP即企业资源规划&#xff08;Enterprise Resource Planning&#xff09;系统&#xff0c;其核心是物料的追踪流转。而在物料追踪流转的基础上&#xff0c;又衍生出一系列各类资源计划的管理和追踪。因此ERP发展成为一款集成各类资源计划&#xff0c;也就是集成企业核心业务流…

EMG肌肉电信号处理合集(二)

本文主要展示常见的肌电信号特征的提取说明。使用python 环境下的Pysiology计算库。 目录 1 肌电信号第一次burst的振幅&#xff0c; getAFP 函数 2 肌电信号波长的标准差计算&#xff0c;getDASDV函数 3 肌电信号功率谱频率比例&#xff0c;getFR函数 4 肌电信号直方图…

视频录制怎么弄?这里有一份超全攻略!

视频录制已成为一项常见任务&#xff0c;无论是为了保存在线学习资料&#xff0c;还是为了记录游戏精彩瞬间&#xff0c;它都可以轻松实现&#xff0c;可是您知道视频录制怎么弄吗&#xff1f;本文将介绍两种视频录制的方法&#xff0c;我们将分步骤详细说明&#xff0c;让您轻…

【elementui】el-popover在列表里循环使用,取消的doClose无效解决办法

目录 一、需求效果二、代码详情html方法接口 一、需求效果 在使用elementui的Popover 弹出框时&#xff0c;需求是在table列表里使用&#xff0c;循环出来&#xff0c;无法取消。 二、代码详情 html <el-table-column v-if"checkPermission([admin,user:resetPass…

c盘爆满?别再清什么c盘了,直接卸载!

1、下载软件 联想电脑管家下载&#xff1a; GeekUninstaller 2、排序软件大小 3、卸载 4、比较 直接节省6.2G的C盘&#xff01;&#xff01;&#xff01; 5、效果

综合实力盘点高性价比还优质的云服务器:亚马逊云科技仍然领跑市场

如果说云计算是一条流向数字化未来的河流&#xff0c;那亚马逊云科技毫无疑问是航行在最前面的帆船&#xff1b;如果说云计算是一条通往数字化未来的铁轨&#xff0c;那亚马逊云科技就是行驶在最前面的高铁。接下来回首往昔&#xff0c;以史为镜&#xff0c;得出云服务器哪家便…