字符串函数的模拟实现

今天我们来了解以下一些字符串函数的模拟实现:
strlen strcpy strcat strcmp

strlen函数的模拟实现

首先我们转到cplusplus中查找strlen的官方解释:
通过查找我们了解到,strlen是用来测量一个字符串长度的函数,函数的返回值就是字符的长度
字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前⾯出现的字符个数(不包含 ‘\0’ )。

函数原型如下

size_t strlen ( const char * str )

在这里插入图片描述
下面我们来简单了解以下strlen函数的使用(strlen函数等字符串函数的头文件一般都是string.h)
例如:我们测量一下字符串“abcdef”的字符串长度

int main()
{
	char arr[] = "abcdef";
	int len = strlen(arr);
	printf("此字符串的长度是%d\n", len);
	return 0;
}

运行结果如下:
在这里插入图片描述
下面我们就可以开始strlen函数的模拟实现了:
我们在之前已经知道,strlen就是从字符串的第一个元素开始往后找"\0",知道找到"\0",一旦找到,函数就立即停止,返回元素个数,这样理解,我们就可以更好地开始它的模拟实现了

方法一:以计数的方式实现

我们定义一个count,用while循环实现count的++,str为字符串的第一个元素的地址,也就是我们常说的首地址,如果解引用后(str)不是"\0",的话,count就++,也就是说元素个数+1,count++后str的位置也要往后移动,所以str++,当str=="\0"时循环停止,count就是字符串的长度了
在这里插入图片描述

代码如下:

int my_strlen(const char * str)
{
 int count = 0;
 assert(str);//进行断言操作,防止str为空
 while(*str)
 {
 count++;
 str++;
 }
 return count;
}
方法二:以递归的方式实现(不能创建临时变量时)

有时候一些题目可能会要求咱们不能创建临时变量来模拟实现,这个时候我们就可以想到递归:
思路如下:
在这里插入图片描述

int my_strlen(const char * str)
{
 assert(str);
 if(*str == '\0')
 return 0;
 else
 return 1+my_strlen(str+1);
}
方法三:以指针的方式实现

在之前的指针学习中我们可以知道指针-指针=两个之间的元素个数,所以这里我们首先定义一个指针变量p为str(字符串首地址),然后用while循环将p移动到\0之前的位置,然后相减得出的值就是字符串str的长度了
代码如下:

int my_strlen(char *str)
{
 assert(str);
 char *p = str;
 while(*p != ‘\0’ )
 p++;
 return p-str;
}
strcpy函数的模拟实现

老规矩,cplusplus查一下:
在这里插入图片描述
函数原型如下:

char* strcpy(char * destination, const char * source );

这里我们要注意:
• 源字符串必须以 ‘\0’ 结束
• 会将源字符串中的 ‘\0’ 拷⻉到⽬标空间
• ⽬标空间必须⾜够⼤,以确保能存放源字符串
• ⽬标空间必须可变
例如,我们将abcde拷贝到des中去:
我们可以打开调试窗口调试一下,就可以看到des将src中的\0也拷贝过去了
在这里插入图片描述
下面我们开始strcpy函数的模拟实现,用指针可以轻松的解决问题:
这里我们要记得断言!如果不断言就是报警,因为*解引用了NULL
当 *src不等于\0时,while循环就继续进行,将src解引用的值赋给 dest,同时dest和src的指针一起往右移动,当src等于\0时,循环跳出,拷贝完成
这里我们要将dest的首地址记录下来,因为官方的函数定义是要求这个函数返回dest的首地址的

char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);

	while (*src)
	{
		*dest=*src;
		dest++;
		src++;
	}
	return ret;
}

也可以简化:

char *my_strcpy(char *dest, const char*src)
{ 
 char *ret = dest;
 assert(dest != NULL);
 assert(src != NULL);
 
 while((*dest++ = *src++))
 {
 ;
 }
 return ret;
}
strcat函数的模拟实现

strcat的作用时将src链接到dest后面,并且这里也要返回dest的首地址
在这里插入图片描述
这里需要注意几点:
• 源字符串必须以 ‘\0’ 结束。
• ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
• ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
• ⽬标空间必须可修改。
我们调试看一看:
我们发现,src的内容就是从dest的\0的位置开始追加的
在这里插入图片描述
下面我们就可以开始模拟实现了
同样的我们需要用ret保存dest的首地址,同时记得断言
我们首先将dest的位置右移到\0的位置,然后再将src解引用的值赋给 dest,同时dest和src的指针一起往右移动,当src等于\0时,循环结束,追加完成

char *my_strcat(char *dest, const char*src)
{
 char *ret = dest;
 assert(dest != NULL);
 assert(src != NULL);
 while(*dest)
 {
 dest++;
 }
 while((*dest++ = *src++))
 {
 ;
 }
 return ret;
}
strcmp函数的模拟实现

strcmp时用于比较两个字符串的,此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续以下对,直到字符不同或达到终止 null 字符为止,如果str1大于str2(⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩),返回 一个大于0的值,str1小于str2,返回 一个小于0的值,如果完全等于,就返回0
在这里插入图片描述
例如:
abcde和abcee比较,由于d的acs码值要小于e所以会返回一个小于0的值
在这里插入图片描述
我们直接用while循环,如果相等,就继续往下走,不相等就就直接放回他们的差值,也就是asc码值相减,如果相等就为0,大于就时大于0,小于就小于0
代码如下:

int my_strcmp (const char * str1, const char * str2)
{
 int ret = 0 ;
 assert(src != NULL);
 assert(dest != NULL);
 while(*str1 == *str2)
 {
 if(*str1 == '\0')//此时两个字符串都遍历完成,且相等,直接返回0
 return 0;
 str1++;
 str2++;
 }
 return *str1-*str2;
}

好了,今天的分享到这里就结束了,谢谢大家!

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

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

相关文章

【六、http】go的http的客户端重定向

一、http的重定向 重定向过程:客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器–》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻…

【嵌入式开发工具】STM32+Keil实现软件工程搭建与开发调试

本篇文章介绍了使用Keil来对STM32F103C8芯片进行初始工程搭建,以及开发与工程调试的完整过程,帮助读者能够在实战中体会到Keil这个开发环境的使用方法,了解一个嵌入式工程从无到有的过程,并且具备快速搭建一个全新芯片对应最小软件…

软件测试工作流程

流程体系介绍 在以往的项目工作中,我参与过,需求评审、测试计划制定、测试用例编写、测试用例执行、测试脚本编写、测试脚本的执行,进行回归测试、验收测试、编写阶段性测试报告等工作 需求分析,需求评审(RPD、产品原…

【ArcGIS Pro二次开发】(74):Python、C#实现Excel截图导出图片

以村庄规划制图为例,通过对现状和规划用地的统计,生成Excel格式的【空间功能结构调整表】后,需要进一步将表格导出成图片,并嵌入到图集中,这样可以实现全流程不用手动参与,让制图的流程完全自动化。 关于E…

深度学习服务器(Linux)开发环境搭建教程

当你拿到一台服务器的使用权时,最头疼的莫过于登陆服务区并配置开发环境。本文将从0开始,讲述一台刚申请的服务器远程登陆并配置开发环境的全过程。希望对你有所帮助 1.登陆服务器 打开MobaXterm软件,创建一个新的Session,选择S…

Java操作redis常见类型数据存储

目录 一、Java连接Redis 1.1 导入pom依赖 1.2 建立连接 二、Java使用Redis 2.1 字符串 String 2.2 哈希 Hash 2.3 列表 List 2.4 集合 Set 2.5 有序集合 Sorted Set 三、Redis的实际应用场景 一、Java连接Redis redis与mysq都是数据库,java操作redis其实跟…

S32K324 UDS Bootloader开发-下位机篇-Bootload软件(1)

文章目录 前言启动过程Bootloader开发链接文件编译文件跳转函数CAN收发相关发送接收初始化及使能CAN周期函数总结前言 上一篇文章介绍了S32K324 -UDS Bootlodaer开发中的需求,本文根据需求开发Bootloader软件。 本文参考NXP官网的S32K324 UBL,其中有一些Bug,也有一些和上位机…

【算法训练营】最近公共祖先+求最大连续bit数

算法 1.最近公共祖先求最大连续bit数 1.最近公共祖先 题目链接 【题目解析】: 最近公共祖先表示距离两个节点最近的公共父节点,这道题考察二叉树。【解题思路】: 题目所描述的满二叉树如下: 1 / \ 2 3 / \ / \ 4 5 6 7 上述树中…

英语——分享篇——每日200词——1-200

1——ball——[bɔːl]——n.球——ball——ba爸(拼音)ll筷子(象形)——爸爸用筷子夹球——The kid is playing the ball. ——孩子在玩皮球。 2——boat——[bəʊt]——n.船——boat——bo60(象形)at在(熟词)——60个人在船上——I have 60 boats.——我有60艘船。 3——bag—…

flutter项目引入本地静态图片资源并展示

想要在flutter中引入静态资源,需要配置pubspec.yaml,将本地的静态资源添加到assets下面: 然后在flutter引入这些静态资源: Image.asset("images/squick.png") 就可以在app中看到这个图片了: 也可以使用网…

第六章:进制转换与数据存储

系列文章目录 文章目录 系列文章目录前言一、进制二、进制的转换三、原码、反码、补码总结 前言 进制转换是程序员的基本功。 一、进制 进制组成二进制0-1 ,满2进1以0b或0B开头十进制0-9 ,满10进1八进制0-7,满8进1以数字0开头表示十六进制0…

045_第三代软件开发-U盘监测

第三代软件开发-U盘监测 文章目录 第三代软件开发-U盘监测项目介绍U盘监测原理解释源代码 关键字: Qt、 Qml、 USB、 Disk、 文件 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object Language)和…

leetcode刷题 - SQL - 简单

目录 1. 175组合两个表 左外连接 2. 181. 超过经理收入的员工 3. 182. 查找重复的电子邮箱 4. 196. 删除重复的电子邮箱 5. 197. 上升的温度 日期作差 6. 511. 游戏玩法分析 I 7. 577. 员工奖金 null条件运算 8. 584. 寻找用户推荐人 9. 586. 订单最多的客户 10. 595. 大的国家…

Linux--线程-条件控制实现线程的同步

1.条件变量 条件变量是线程另一可用的同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。 条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程在获…

大航海时代Ⅳ 威力加强版套装 HD Version (WinMac)中文免安装版

《大航海时代》系列的人气SRPG《大航海时代IV》以HD的新面貌再次登场!本作品以16世纪的欧洲“大航海时代”为舞台,玩家将以探险家、商人、军人等不同身份与全世界形形色色的人们一起上演出跌宕起伏的海洋冒险。游戏中玩家的目的是在不同的海域中掌握霸权…

新技术前沿-2023-应用GPT提问模板写技术文章

参考一份万能的GPT提问模版!直接套用! 参考用GPT写技术文章是真爽! 参考码住这篇 8200 字 ChatGPT 实战指南!! 1 GPT提问模板 想让GPT回答的内容符合我们所希望的,最最重要的一点就在于我们如何提问。提问…

【C++】一篇文章搞懂auto关键字及其相关用法!

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

【Mybatis小白从0到90%精讲】11:Mybatis批量插入 batchInsert

文章目录 前言foreach批量插入前言 在实际开发中,我们经常需要批量插入大量数据到数据库中,而MyBatis也提供了批量插入的支持,可以大大提高插入效率。 今天要分享的是 工作中常用的在Mapper中使用foreach标签批量插入数据的方式,比在Java代码中循环调用Mapper的单条插入性…

SpringBoot整合EasyExcel

springboot整合easyExcel的全流程&#xff0c;跟着做就能出来。对项目没有侵入要求。0侵入&#xff0c;可插拔 依赖 <!--操作Excel依赖--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>…

微信小程序 uCharts的使用方法

一、背景 微信小程序项目需要渲染一个柱状图&#xff0c;使用uCharts组件完成 uCharts官网指引&#x1f449;&#xff1a;uCharts官网 - 秋云uCharts跨平台图表库 二、实现效果 三、具体使用 进入官网查看指南&#xff0c;有两种方式进行使用&#xff1a;分别是原生方式与组…