C语言 之 strlen、strcpy、strcat、strcmp字符串函数的使用和模拟实现
文章目录
- strlen的使用和模拟实现
- 函数的原型
- strlen模拟实现:
- 方法1
- 方法2
- 方法3
- strcpy的使用和模拟实现
- 函数的原型
- strcpy的模拟实现:
- strcat的使用和模拟实现
- 函数的原型
- strcat的模拟实现:
- strcmp的使用和模拟实现
- 函数的原型
- strcmp的模拟实现
本章的内容主要讲解这4个与字符串相关的函数的原型、使用以及模拟实现
strlen的使用和模拟实现
函数的原型
size_t strlen ( const char * str );
1.字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前⾯出现的字符个数(不包含 ‘\0’ )。
2.参数指向的字符串必须要以 ‘\0’ 结束。
3.注意函数的返回值为size_t,所以结果不能为负数。
4.strlen的使⽤需要包含头⽂件string.h
strlen模拟实现:
方法1
//计数器方式
int my_strlen(const char* str)
{int count = 0;while (*str){count++;str++;}return count;
}
int main()
{const char* str1 = "fallzzzzz";int tmp = my_strlen(str1);printf("lenth = %d\n", tmp);return 0;
}
方法2
//不能创建临时变量计数器
//使用递归的方式
int my_strlen(const char* str)
{if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}
int main()
{const char* str1 = "fallzzzzz";int tmp = my_strlen(str1);printf("lenth = %d\n", tmp);return 0;
}
方法3
//指针-指针的⽅式
//指针-指针的结果是两指针之间的元素个数
int my_strlen(char* str)
{char* p = str;while (*p != '\0'){p++;}return p - str;
}
int main()
{const char* str1 = "fallzzzzz";int tmp = my_strlen(str1);printf("lenth = %d\n", tmp);return 0;
}
strcpy的使用和模拟实现
函数的原型
char * strcpy ( char * destination, const char * source );
我们把source称作源字符串
我们把destination称作目标字符串
该函数为拷贝函数,可以把源字符串拷贝到目标字符串
1.源字符串必须以 ‘\0’ 结束。
2.该拷贝会将源字符串中的 ‘\0’ 拷贝到目标空间。
3.⽬标空间必须足够大,以确保能存放源字符串。
4.⽬标空间必须是可修改的,即不为const。
strcpy的模拟实现:
char* my_strcpy(char* dest, const char* src)
{//用临时变量保存 因为之后dest和src的指针指向有变 无法直接返回指向首元素的指针char* ret = dest;assert(dest != NULL);assert(src != NULL);while ((*dest++ = *src++)){//在while的循环条件中就完成了拷贝//所以这里用空语句即可;}return ret;
}int main()
{char str1[] = "fallzzzzz";char str2[20];char* tmp = my_strcpy(str2, str1);printf("str2 = %s\n", tmp);return 0;
}
strcat的使用和模拟实现
函数的原型
char * strcat ( char * destination, const char * source );
1.源字符串必须以 ‘\0’ 结束。
2.目标字符串中也得有 ‘\0’ ,否则没办法知道追加从哪里开始。
3.⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
4.⽬标空间必须可修改,即目标字符串不为const类型。
该函数为追加字符串函数,能够在一个字符串之后追加上另一个字符串
strcat的模拟实现:
char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest != NULL);assert(src != NULL);while (*dest) //遇到'\0'停止{dest++;}while ((*dest++ = *src++)){;}return ret;
}
int main()
{char str1[] = "hello ";char str2[] = "the ";char str3[] = "fallzzzzz ";char str4[50];strcpy(str4, str1); //先将str1拷贝到str4,目的是让目标字符串中有'\0'my_strcat(str4, str2);my_strcat(str4, str3);puts(str4); //将字符串(以‘\0’结束的字符序列)输出return 0;
}
strcmp的使用和模拟实现
函数的原型
int strcmp ( const char * str1, const char * str2 );
该函数为字符串的大小比较函数,比较的是两个字符串中对应位置上的字符的ASCII码值的大小。
第⼀个字符串大于第⼆个字符串,则返回大于0的数字
第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串小于第⼆个字符串,则返回小于0的数字
strcmp的模拟实现
int my_strcmp(const char* str1, const char* str2)
{int ret = 0;assert(str1 != NULL);assert(str2 != NULL);while (*str1 == *str2){if (*str1 == '\0') {//在*str1 == *str2的条件下,其中一个为'\0',那么另一个也为'\0'//两个都访问到'\0',那么就说明这两个字符串是相等的,所以跳出循环 返回0return 0;} str1++;str2++;}return *str1 - *str2; //将ASCII码值相减的结果作为返回值 就能通过该字符ASCII码值的大小关系比较出字符串的大小关系
}
int main()
{char* str1 = "hello";char* str2 = "fallzzzzz";int tmp = my_strcmp(str1, str2);printf("%d", tmp);return 0;
}
相关文章:

C语言 之 strlen、strcpy、strcat、strcmp字符串函数的使用和模拟实现
文章目录 strlen的使用和模拟实现函数的原型strlen模拟实现:方法1方法2方法3 strcpy的使用和模拟实现函数的原型strcpy的模拟实现: strcat的使用和模拟实现函数的原型strcat的模拟实现: strcmp的使用和模拟实现函数的原型strcmp的模拟实现 本…...

CAPL使用结构体的方式组装一条DoIP车辆识别请求报文(payload type 0x0002)
DoIP车辆识别请求(payload type 0x0002)报文的格式为: /******************************************************** +--------+--------+--------+--------+ |version | inVer | type | +--------+--------+--------+--------+ | length …...

数据接入教学
数据接入教学 1、开通外部网络策略2、检查本地防火墙策略3、测试网络连通性4、工具抓包命令5、本地测试发送与监听 1、开通外部网络策略 保证外部网络联通、保证内部防火墙开通策略(可以关闭进行测试) 2、检查本地防火墙策略 关闭进行测试 停止firewa…...

炒作将引发人工智能寒冬
我们似乎经常看到人工智能的进步被吹捧为机器真正变得智能的一大飞跃。我将在这里挑选其中的一个例子,并确切解释为什么这种态度会为人工智能的未来埋下隐患。 这很酷,这是一个非常困难且非常具体的问题,这个团队花了3 年时间才解决。他们一定…...

clamp靶机复现
靶机设置 设置靶机为NAT模式 靶机IP发现 nmap 192.168.112.0/24 靶机IP为192.168.112.143 目录扫描 dirsearch 192.168.112.143 访问浏览器 提示让我们扫描更多的目录 换个更大的字典,扫出来一个 /nt4stopc/ 目录 目录拼接 拼接 /nt4stopc/ 发现页面中有很多…...

mfc100u.dll丢失问题分析,详细讲解mfc100u.dll丢失解决方法
面对mfc100u.dll文件丢失带来的挑战时,许多用户都可能感到有些无助,尤其是当这一问题影响到他们日常使用的软件时。但实际上,存在几种有效方法可以帮助您快速恢复该关键的系统文件。为了方便不同水平的用户,本文将详细解析各种处理…...

【C++】什么是内存管理?
如果有不懂的地方,可以看我以往文章哦! 个人主页:CSDN_小八哥向前冲 所属专栏:C入门 目录 C/C内存分布 C内存管理方式 new/delete操作内置类型 new/delete操作自定义类型 operator new与operator delete函数 new和delete实现…...

产业经济大脑建设方案(五)
为了提升产业经济的智能化水平,我们提出建设一个综合产业经济大脑系统,该系统通过整合大数据分析、人工智能和云计算技术,构建全方位的数据采集、处理和决策支持平台。该平台能够实时监测产业链各环节的数据,运用智能算法进行深度…...

如何在 Odoo 16 中覆盖创建、写入和取消链接方法
Odoo 是一款强大的开源业务应用程序套件,可为各种业务运营提供广泛的功能。其主要功能之一是能够自定义和扩展其功能以满足特定的业务需求。在本博客中,我们将探讨如何覆盖Odoo 16中的创建、写入和取消链接方法,从而使您无需修改核心代码…...

pip离线安装accelerate
一、离线下载到当前文件夹 pip download accelerate -d ./anzhuangbao# 制定版本使用以下命令pip download accelerate0.32.0 -d ./anzhuangbao二、离线安装 cd anzhuangbaipip install --no-index --find-links. accelerate三、验证是否安装 pip show accelerateAccelerate: …...

VUE3请求意外报跨越错误或者500错误问题
1.有可能是请求传参和传参类型写错了 首先要确保该请求接口是支持跨域的(不支持叫后端改) access-control-allow-headers:Content-Type, Accept, Access-Control-Allow-Origin, api_key, Authorization access-control-allow-methods:GET, POST, OPTIO…...

vue 关于两个if条件中的promise
一、案例效果 期望if判断条件里的两个promise 都同时执行完成 二、 初始代码案例 const formatDetail async (fnArgsJsonParams: MapLogicType) > {if (fnArgsJsonParams?.targetFeatureName) {const resDetailData await formatFeatureInfo(fnArgsJsonParams.targetF…...

C/C++移位运算问题
目录 上期答案揭晓: 回忆: 问题1展现: 问题2展现: 改进方案: 下期预告:C语言类型转换的问题。 上期答案揭晓: 上期的问题大家是否都有了想法,下面说说我的思路。 上次我们提到…...

录屏工具 Icecream Screen Recorder PRO v7.41
Icecream Screen Recorder的免费屏幕录制工具,具备捕捉视频、音频、图片和游戏等多种功能。以前推荐过的icecreamPDF也是他家的非常好用! 下载链接:「录屏」来自UC网盘分享https://drive.uc.cn/s/b474616b91534...

解决连接不上Linux和服务器中的Nacos(Windows中能连接但是Linux中却不行)
报错 com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNKNOWN: Uncaught exception in the SynchronizationContext. Re-thrown. at com.alibaba.nacos.shaded.io.grpc.Status.asRuntimeException(Status.jav 2024-08-13T10:21:52.93708:00 ERROR 27764 --- …...

【LLM大语言模型-开篇】LLM入门实践指南
"LLM入门实践指南"是一个通过代码实践,为大模型入门读者提供全面且较为深入的大模型技术视角的教程。 为何关注LLM? 创新与变革:LLM不仅推动了自然语言处理(NLP)领域的进步,还在诸多行业中催生了…...

实时视频换脸、8 万家 AI 公司消失、论文天价售卖、新的 scaling law、爆火毒舌 AI | AI 掘金视界周刊第 5 期
AI 视界周刊由战场小包维护,每周一更新,包含热点聚焦、应用破局、学术前沿、社区热议、智见交锋、跨界 AI、企业动态和争议 AI 八大板块,后续板块划分和内容撰写在周刊迭代过程中持续优化,欢迎大家提出建议。 欢迎大家来到《AI 视…...

XSS靶场(1-11关)
目录 简述xss xss第1关 xss第2关 编辑 xss第3关 xss第4关 xss第5关过滤了 on script xss第6关 xss第7关 xss第8关 xss第9关 xss第10关 xss11关 我把源代码靶场放到了最顶端 简述xss XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法…...

vue2 子组件props接收父组件对象或数组必须使用函数进行返回
export default{ name:MyComponent, props:{ title:{ type:String, default:"" }, age:{ type:Number, default:1 }, names:{ type:Array, //数组或对象必须用函数进行返回 default:function(){ return [] …...

【算法/学习】双指针
✨ 少年要迎着朝阳,活得肆无忌惮 🌏 📃个人主页:island1314 🔥个人专栏:算法学习 🚀 欢迎关注:👍点赞 &a…...

Springboot集成Liquibase笔记整理
添加依赖<dependency><groupId>org.liquibase</groupId><artifactId>liquibase-core</artifactId> </dependency>添加配置spring:liquibase:contexts: dev,testenabled: true编写liquibase配置类Configuration EnableConfigurationPropert…...

Python拆分无atlas图集(瑕疵版)
老板给了张没有atlas文件的图集让我拆图,简单写了一版凑合用。 存在的问题: 可能会拆出来一些小尺寸的透明像素图片;可能会拆出来一些偏大的小图的整体集合;可能会把应该是一块的小图批成两半,不过不多;其…...

SQLALchemy 排序
SQLALchemy 排序 基本用法多列排序使用函数或表达式进行排序注意事项在SQLAlchemy中,排序(Ordering)是通过order_by()方法实现的。这个方法允许你指定一个或多个列(或表达式),用于对查询结果进行排序。你可以指定升序(默认)或降序排序。 基本用法 假设你有一个User模…...

【iOS】Block底层分析
目录 前言Block底层结构Block捕获变量原理捕获局部变量(auto、static)全局变量捕获实例self Block类型Block的copyBlock作为返回值将Block赋值给__strong指针Block作为Cocoa API中方法名含有usingBlock的方法参数Block作为GCD API的方法参数Block属性的写…...

复现dom破坏案例和靶场
文章目录 靶场网址第一个实验步骤和原理(代码为示例要根据自己的实验修改) 第二个实验步骤和原理(代码为示例要根据自己的实验修改) 靶场网址 注册后点击 第一个实验 此实验室包含一个 DOM 破坏漏洞。注释功能允许“安全”HTML。为了解决这个实验,请构造一个 HT…...

【高校科研前沿】南方科技大学冯炼教授等人在遥感顶刊RSE发文:全球人类改造的基塘系统制图
1.文章简介 论文名称:Global mapping of human-transformed dike-pond systems(全球人类改造的基塘系统制图) 第一作者及单位:Yang Xu(南方科技大学环境学院) 第一通讯作者及单位:冯炼&#x…...

How to run angular CICD on gitlab-runner of wsl?
前提文件 .gitlab-ci.yml, .dockerignore, ci-funcs.sh, Dockerfile, karma.conf.js, nginx.conf, nginx-custom.conf, sonar-project.properties 1.test.ts const context require.context(./app/pages, true, /\.spec\.ts$/); 2.sonar-project.properties sonar.sourcessrc/…...

搭建Java集成开发环境IntelliJ IDEA
搭建Java集成开发环境(Integrated Development Environment,简称IDE)IntelliJ IDEA是一个涉及多个步骤的过程,旨在帮助Java开发者高效、舒适地进行编程工作。IntelliJ IDEA由JetBrains公司开发,以其强大的代码自动补全…...

JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
🌐JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决 🖥️ 浏览器事件学习和编写 浏览器事件是用户与网页交互的主要方式,了解并掌握这些事件的处理方…...

驾校预约学习系统--论文pf
TOC springboot373驾校预约学习系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域…...