【C语言】常见字符串函数的功能与模拟实现

目录

1.strlen()

模拟实现strlen()

2.strcpy()

模拟实现strcpy()

3.strcat()

模拟实现strcat()

4.strcmp()

模拟实现strcmp()

5.strncpy()

模拟实现strncpy()

6.strncat()

模拟实现strncat()

7.strncmp()

模拟实现strncmp()

8.strstr()

模拟实现strstr()

9.strtok()

strtok的功能及注意事项

10.strerror()


1.strlen()

功能:用于计算字符串长度的函数,需要的参数是一个地址,得到地址之后会从这个地址开始往后找直到碰见\0,返回的是碰见\0之前统计的字符个数

strlen值得注意的点就是他的返回值是一个无符号数,可以通过这样一个代码来验证

按道理来说后面的比前面的字符串长,返回值不应该小于零吗,那应该打印小于等于吧,但是当我们运行之后发现运行结果居然是大于,这是因为strlen的返回值是一个无符号数,两个无符号数相减当然还是无符号数,因此打印结果是大于。如果想要判断哪个字符串长,直接这样写就行

如果就是要作差,把他们的返回值都强制类型转换成int类型即可

模拟实现strlen()

2.strcpy()

功能:把source指向的地址开始的字符串(包括\0)拷贝到destination指向的字符串去。

功能如图所示

注:1.strcpy的源串必须以\0结束

2.会把源串的\0拷贝到目标空间,并不是替换掉几个字符。

3.目标空间必须足够大,确保能够放得开拷贝的字符串

4.目标空间必须可变 比如char* p="abc",这里的abc就是一个常量字符串,是不可变的。

模拟实现strcpy()

实际上这个代码可以简化

后置++,先使用,再++,直到把\0赋给*des,这时候不满足while循环的条件,因此跳出循环。

3.strcat()

功能:把源头的字符串追加到目的串末尾。

模拟实现strcat()

注:strcat函数不能给自己追加,从模拟实现的原理就能看出来,当我们找到des的\0时,会用*src覆盖掉\0,比如我们要在hello后面追加一个hello,des指向\0的时候src指向了h,并用w把\0覆盖掉,然后des和src都往后走一步,直到源串追加到o的时候,再往后追加没有\0了,就又追加h了,导致死循环。

4.strcmp()

功能:比较两个字符串的大小,如果前者比后者大,返回一个大于零的值,反之返回一个小于零的值,如果二者相等就返回0。

模拟实现strcmp()

还可以简洁一点

5.strncpy()

功能:从source拷贝num个字符到destination去,如果source指向的字符串不够num个,多出来的个数均用\0代替

模拟实现strncpy()

6.strncat()

功能:在destination字符串第一个\0处追加num个source开头的字符。

注:1.只会追加num个,一旦追加完num个,就会自动补一个\0

2.如果source指向的字符串不足num个,在追加完source执行的字符串之后便会自动补一个\0,且只补一个。

模拟实现strncat()

7.strncmp()

功能:比较前num个字符的大小,如果前者大就返回一个大于零的值,后者大返回一个小于0的值,相等返回0。

注:只要前num个字符相等,不管后面是什么,都会返回0

模拟实现strncmp()

8.strstr()

功能:在字符串str1中找字符串str2第一次出现的位置,找到了就返回这个位置,找不到返回一个NULL

模拟实现strstr()

思路

各变量的作用:就是先要从第一个字符开始比较,如果第一个字符相同,再比较第二个,直到找到str2。如果我们直接操作str1和str2,就会导致这两个指针指向的位置被改变,那我们在比较完一个字符发现不行,想要从下一个字符开始找的时候,就不直到从哪开始了,因为此时str1已经不知道走到哪去了。因此我们需要一个cp指针来记录这个 如果从当前位置开始无法找到str2,下一个尝试寻找的位置。并且需要一个能让我们直接操作的指针s1。(因为cp既然是记录位置的,我们就不能在比较的过程中随意操作他)又因为每次重新开始寻找str2都要让srt2从头开始,因此我们也不能直接操作str2,因此我们又创建了一个s2指针用来在比较的时候操作。

找的过程显然是一个循环,只要cp没有指向\0我们就让他继续找,找的过程中是*s1与*s2比较,如果二者相等就一直比较,直到一方出现了\0,如果*s1已经是\0但是*s2不是\0,说明str1中已经不可能找到str2,我们直接返回NULL,如果发现*s2是\0,那不管此时*s1是不是\0,都已经找到了str2,此时返回cp。如果cp都已经指向了\0,说明肯定找不到了,返回NULL(实际上只要cp指向的字符串比str2短就不可能找到了)

注:这种写法有点像暴力枚举法,效率还是比较低的。

再来介绍两个函数的功能,这两个函数相较于前面几个用的比较少,就不模拟实现了

9.strtok()

strtok的功能及注意事项

1.sep参数是个字符串,定义了用作分隔符的字符集合

2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。

3.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)

4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。也就是说这个函数内部有记录功能。

5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

6.如果字符串中不存在更多的标记,则返回 NULL 指针

下面是一个使用场景

当然这种场景是因为我们知道了字符串是什么,有几个分割符。如果想要一般性的调用,可以这样写

10.strerror()

库函数执行发生错误的时候会把一个错误码放在errno这个变量中,errno是C语言提供的一个全局变量。

每个错误码都有其对应的信息。我们可以打印一下看看

strerror函数返回的是错误码所对应字符串的首字符地址。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据密集型应用系统设计

数据密集型应用系统设计 原文完整版PDF:https://pan.quark.cn/s/d5a34151fee9 这本书的作者是少有的从工业界干到学术界的牛人,知识面广得惊人,也善于举一反三,知识之间互相关联,比如有个地方把读路径比作programming …

基于 Python 的大数据的电信反诈骗系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

three.js 箭头ArrowHelper的实践应用

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div></div></el-main></…

Linux系统安全:安全技术 和 防火墙

一、安全技术 入侵检测系统&#xff08;Intrusion Detection Systems&#xff09;&#xff1a;特点是不阻断任何网络访问&#xff0c;量化、定位来自内外网络的威胁情况&#xff0c;主要以提供报警和事后监督为主&#xff0c;提供有针对性的指导措施和安全决策依据,类 似于监控…

【Java】零基础蓝桥杯算法学习——二分查找

算法模板一: // 数组arr的区间[0,left-1]满足arr[i]<k,[left,n-1]满足arr[i]>k;Scanner scan new Scanner(System.in);int[] arr {1,2,3,4,5};int left 0,right arr.length-1;int k scan.nextInt();while(left<right) {//leftright时退出循环int mid (leftrigh…

Hadoop:认识MapReduce

MapReduce是一个用于处理大数据集的编程模型和算法框架。其优势在于能够处理大量的数据&#xff0c;通过并行化来加速计算过程。它适用于那些可以分解为多个独立子任务的计算密集型作业&#xff0c;如文本处理、数据分析和大规模数据集的聚合等。然而&#xff0c;MapReduce也有…

开源免费的Linux服务器管理面板分享

开源免费的Linux服务器管理面板分享 一、1Panel1.1 1Panel 简介1.2 1Panel特点1.3 1Panel面板首页1.4 1Panel使用体验 二、webmin2.1 webmin简介2.2 webmin特点2.3 webmin首页2.4 webmin使用体验 三、Cockpit3.1 Cockpit简介3.2 Cockpit特点3.3 Cockpit首页3.4 Cockpit使用体验…

算法沉淀——栈(leetcode真题剖析)

算法沉淀——栈 01.删除字符串中的所有相邻重复项02.比较含退格的字符串03.基本计算器 II04.字符串解码05.验证栈序列 栈&#xff08;Stack&#xff09;是一种基于先进后出&#xff08;Last In, First Out&#xff0c;LIFO&#xff09;原则的数据结构。栈具有两个主要的操作&am…

宿舍报修|宿舍报修小程序|基于微信小程序的宿舍报修系统的设计与实现(源码+数据库+文档)

宿舍报修小程序目录 目录 基于微信小程序的宿舍报修系统的设计与实现 一、前言 二、系统功能设计 三、系统实现 1、学生信息管理 2 维修人员管理 3、故障上报管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

算法学习——LeetCode力扣贪心篇1

算法学习——LeetCode力扣贪心篇1 455. 分发饼干 455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 描述 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[…

蓝桥杯电子类单片机提升一——超声波测距

前言 单片机资源数据包_2023 一、超声波测距原理 二、超声波测距的应用 1.超声波的发射 2.单片机知识补充&#xff1a;定时器 3.超声波的接收与计时 4.距离的计算 1&#xff09;定时器1为16位自动重载&#xff0b;1T11.0592MHz 2&#xff09;定时器1为16位自动重载&am…

vscode运行C/C++时候cmd.exe界面显示

写了一些命令行传参的程序&#xff0c;需要终端输入参数&#xff0c;默认是输出结果显示在它自己的终端界面 Code-runner: Run In Terminal 打勾就行 效果&#xff1a;

从0开始图形学(光栅化)

前言 说起图形学&#xff0c;很多人就会提到OpenGL&#xff0c;但其实两者并不是同一个东西。引入了OpenGL加重了学习的难度和成本&#xff0c;使得一些原理并不直观。可能你知道向量&#xff0c;矩阵&#xff0c;纹理&#xff0c;重心坐标等概念&#xff0c;但就是不知道这些概…

树莓派4B(Raspberry Pi 4B)使用docker搭建阿里巴巴sentinel服务

树莓派4B&#xff08;Raspberry Pi 4B&#xff09;使用docker搭建阿里巴巴sentinel服务 由于国内访问不了docker hub&#xff0c;而国内镜像仓库又没有适配树莓派ARM架构的sentinel镜像&#xff0c;所以我们只能退而求其次——自己动手构建镜像。本文基于Ubuntu&#xff0c;Jav…

基于centos的Linux中如何安装python

前言 之前在linux上安装python的时候没来及记录下来&#xff0c;感觉还是有必要的&#xff0c;所以现在打算把原来装好的python卸载掉&#xff0c;然后重装一遍&#xff0c;重新记录一下。当前环境是否安装python 通过查询我发现机器里有3个版本的python&#xff0c;第一个是…

【教程】Kotlin语言学习笔记(二)——数据类型(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 文章目录 【Kotlin语言学习】系列文章一、基本数据…

每日OJ题_递归②_力扣21. 合并两个有序链表

目录 力扣21. 合并两个有序链表 解析代码 力扣21. 合并两个有序链表 21. 合并两个有序链表 难度 简单 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4]…

Spring Boot 笔记 005 环境搭建

1.1 创建数据库和表&#xff08;略&#xff09; 2.1 创建Maven工程 2.2 补齐resource文件夹和application.yml文件 2.3 porn.xml中引入web,mybatis,mysql等依赖 2.3.1 引入springboot parent 2.3.2 删除junit 依赖--不能删&#xff0c;删了会报错 2.3.3 引入spring web依赖…

最新wordpress外贸主题

日用百货wordpress外贸主题 蓝色大气的wordpress外贸主题&#xff0c;适合做日用百货的外贸公司搭建跨境电商网站使用。 https://www.jianzhanpress.com/?p5248 添加剂wordpress外贸建站主题 橙色wordpress外贸建站主题&#xff0c;适合做食品添加剂或化工添加剂的外贸公司…

鸿蒙开发理论之页面和自定义组件生命周期

1、自定义组件和页面的关系 页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;Entry装饰的自定义组件为页面的入口组件&#xff0c;即页面的根节点&#xff0c;一个页面有且仅能有一个Entry。只有被Entry装饰的组件才可以调用页面的生命周期。自…