字符函数与字符串函数(2)

遇见她如春水映莲花

字符函数与字符串函数(2)

  • 前言
  • 一、strcat
    • strncat
  • 二、strcmp
    • strncmp
    • 在这里插入图片描述
  • 三、strstr
  • 四、strtok
  • 五、strerror
  • 总结


前言

根据上期字符函数与字符串函数我们可以了解到字符函数与个别字符串函数的用法,
那么接下来就开始对字符串函数的详细讲解(strcat、strcmp、strncpy、strncat、strncmp、strstr、


以下是本篇文章正文内容,下面案例可供参考

一、strcat

1.深刻理解函数:

在这里插入图片描述
destination是追加目的地址,而source则是要追加的内容
返回值:char*

2.功能实现:

示例:(strcat是用于函数的追加)
在这里插入图片描述

3:模拟代码:

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcat(char* dest, const char* source)
{char* p = dest;assert(source);assert(dest);//1.先找到目标空间的‘\0’while (*dest){dest++;}//2.追加数据while (*source){*dest = *source;dest++;source++;}return  p;
}
int main()
{char arr[20] = "abcdef";char arr1[20] = "bbbb";my_strcat(arr, arr1);printf("%s", arr);return 0;
}

代码难度一般,还是很好理解的!!!

strncat

  1. 了解:strncat与strcat的区别

通过对比我们可以很好的看出他们之中差了个size_t num,而这个num作用是可以让你想追加多少个就追加多少个
追加的长度由你来控制,同时也起到保护的作用避免不必要的事故

2.功能实现:

在这里插入图片描述
这里的strncat追加是怎么追加的呢?
通过调试可以得出以下结果:
1:在打印的最后一位的下一位加个‘\0’
在这里插入图片描述
2:如果字符串的长度小于追加长度那么就只会追加字符串(如图所示)

在这里插入图片描述

二、strcmp

1.理解函数:

在这里插入图片描述
返回值:int(类型)
用const来保证指针charstr1和str2不被修改

2.功能实现

strcmp功能是用于字符串比较
比较过程是一个一个相比(如图所示)
在这里插入图片描述
---------------------那么strcmp怎么告诉你大小呢?

在这里插入图片描述

我们可以通过返回值来确定大小
如:
如果第一个字符大于另外一个数组的第一个字符那么就会返回(>0)
等于返回(=0)
小于返回(<0)

3.函数模拟实现

int my_strcmp(char* dest, const char* source)
{assert(dest);assert(source);while (*dest == *source){dest++;source++;}if (*dest > *source){return 1;}else{return -1;}
}
int main()
{char arr[20] = "abcdef";char arr1[20] = "bsdjfhf";int ret = my_strcmp(arr1, arr);printf("%d", ret);}

strncmp

1:理解函数

在这里插入图片描述
在这里插入图片描述
相差了size_t num也就是指定内容比较

2.实现函数

int main()
{char arr[] = "abcdef";char arr1[20] = "abcds";int ret = strncmp(arr, arr1, 4);printf("%d", ret);
}

在这里插入图片描述

三、strstr

1.了解函数

! [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimgblog.csdnimg.cn%2Fdirect%2Fa01330c4fe3c4f8783283a698c5c7ea5.png&pos_id=img-490bqnMB1330c4fe3c4f878285a6933c5c4ea5.png7
功能:查找字符串
如:
this is a student. 要查找 is
输出:为 is is a student
在这里插入图片描述

代码如下:

int main()
{char arr[] = "this is a student";char arr1[] = "is";printf("%s",strstr(arr, arr1));return 0;
}

2.strstr功能模拟

函数模拟有3种场景
在这里插入图片描述
1.第一种情况
my_strstr(“abcdef”,“bcd”);
在这里插入图片描述
一个一个比较
如果不相等,你们str1往后走一步(以此类推)
但是只有俩个指针来遍历的话是不够的
于是我们得出:要专门有个指针记录开始匹配的位置
2.第二种情况
在这里插入图片描述
这会有一次复杂的过程,str1指向的一个b,与str2比较但是还是找不到,那么我们就要让str指向第二个b时又与str2进行比较(所以又要俩个指针一个记录str2的初始位置,一个记录str1初始位置)

char* my_strstr(const char* dest, const char* src)
{assert(dest);assert(src);if (*src == '\0')//不能传空地址{return (char*)dest;}//1.abcdef\0 查找   bcd\0//2.abbbcdef\0 查找  bbc\0//3.abcdef\0   查找    bbq\0char* p = dest;char* s = dest;char* s1 = src;while (*p){s = p;s1 = src;while(*s!='\0'&&*s1!='\0'&& *s == *s1){s++;s1++;}if (*s1 == '\0'){return p;}p++;}return NULL;
}
int main()
{char arr[] = "this is a student";char arr1[] = "is";printf("%s",strstr(arr, arr1));return 0;
}

四、strtok

1.理解函数

在这里插入图片描述

当strtok进行过一次之后,他会保留俩个指针一个是初始指针(头个指针),另外一个就是所标记点位置指针
如:
ret = strtok(arr, sep);
printf(“%s\n”, ret);
ret = strtok(NULL, sep);//这里传空值是因为strtok记录了标记点位置的指针

返回值char*

2.函数实现

int main()
{char arr[] = "cwzhff@yeah.net";const char* sep = "@.";char arr2[30] = { 0 };strcpy(arr2, arr);char* ret = NULL;ret = strtok(arr, sep);printf("%s\n", ret);ret = strtok(NULL, sep);printf("%s\n", ret);ret = strtok(NULL, sep);printf("%s\n", ret);
}

这样比较冗余,我们可以改进下代码

int main()
{char arr[] = "cwzhff@yeah.net";const char* sep = "@.";char arr2[30] = { 0 };strcpy(arr2, arr);char* ret=NULL;for(ret=strtok(arr,sep);ret!=NULL;ret=strtpk(NULL,sep)){printf("%s",ret);}return 0;
}

五、strerror

1、函数理解

在这里插入图片描述
在这里插入图片描述
每个码都有对应的错误信息

2.函数实现
在这里插入图片描述

总结

1:函数strcat与strncat、strcpy与strncpy、strcmp与strncmp的区别

在这里插入图片描述
在这里插入图片描述
这俩种尽量用第二种比较安全(也称相对安全函数
字符函数与字符串函数对于以后的代码实现具有很大的帮助,因此深刻理解字符函数与字符串函数是有必要的!!!

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

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

相关文章

STM32——GPIO篇

技术笔记&#xff01; 1. 什么是GPIO&#xff1f; GPIO是通用输入输出端口&#xff08;General-purpose input/output&#xff09;的英文简写&#xff0c;是所有的微控制器必不可少的外设之一&#xff0c;可以由STM32直接驱动从而实现与外部设备通信、控制以及采集和捕获的功…

当管道运算符遇上无限可能:探索数据流的奇妙之旅

文章目录 序言目的进程间通信的理解进程间通信的发展历史管道创建验证管道的大小管道的4种情况管道的5种特征 序言 通过该命令计算了在当前路径下一共有多少个文件夹的任务 进程虽然有独立性,但是进程并不孤僻,他们之间也会相互进行协作共同完成一件事 这个前提是他们之间的信…

嵌入式全栈开发学习笔记---C语言笔试复习大全7(编程题1~8)

目录 1、200&#xff5e;300之间能被3整除的数&#xff0c;5个一行输出&#xff1b; 2、求两个数的最大公约数、最小公倍数&#xff1b; 3、输入十个数&#xff0c;求出平均值&#xff1b; 4、通过编程实现,统计1~n有多少个9&#xff1b; 5、有1、2、3、4个数字&#xff0…

C#简单创建DLL文件并调用

DLL是Dynamic Link Library的缩写&#xff0c;意为动态链接库。动态链接库其实是由编译器将一系列相关的类型编译、链接并封装成一个独立的文件&#xff0c;与对其进行调用的程序分开。这样一个独立的文件相当于程序的一个模块&#xff0c;如果需要对程序进行更新&#xff0c;只…

ESP32-C3第二路串口(非调试)串口打通(1)

1. 概述与引脚复用 《ESP32-C3 系列芯片技术规格书》中提到&#xff0c;ESP32-C3系列芯片中有两路串口。 第1路串口就是常用的调试串口&#xff0c;在笔者使用的ESP32-C3-DevKitC-02开发板中&#xff0c;这一路串口通过CP2102 USB转UART桥芯片与电脑的USB口相连接&#xff0c;…

42 线程池

一种线程使用模式&#xff0c;线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。线程池维护多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价&#xff0c;线程池不仅能保证内核的充分利用&#xf…

redis中的双写一致性问题

双写一致性问题 1.先删除缓存或者先修改数据库都可能出现脏数据。 2.删除两次缓存&#xff0c;可以在一定程度上降低脏数据的出现。 3.延时是因为数据库一般采用主从分离&#xff0c;读写分离。延迟一会是让主节点把数据同步到从节点。 1.读写锁保证数据的强一致性 因为一般放…

数据结构------栈的介绍和实现

目录 1.栈的一些初步认识 2.栈的实现 3.相关的函数介绍 &#xff08;1&#xff09;栈的初始化 &#xff08;2&#xff09;栈的销毁 &#xff08;3&#xff09;栈的数据插入 &#xff08;6&#xff09;判断是否为空 &#xff08;7&#xff09;栈的大小 4.栈的实现完整…

【数据结构(邓俊辉)学习笔记】列表01——从向量到列表

文章目录 0.概述1. 从向量到列表1.1 从静态到动态1.2 从向量到列表1.3 从秩到位置1.4 列表 2. 接口2.1 列表节点2.1.1 ADT接口2.1.2 ListNode模板类 2.2 列表2.2.1 ADT接口2.2.2 List模板类 0.概述 学习了向量&#xff0c;再介绍下列表。先介绍下列表里的概念和语义&#xff0…

【HM】DevEco Studio如何使用代码编程AI助手

大家可能都有用过或了解过github copilot插件&#xff0c;确实为我们编码智能、提升开发效率有很大的帮助。推荐两款国产的ai编程插件&#xff0c;分别是华为的CodeArts Snap和阿里的通义灵码。 DevEco 中如何安装通义灵码&#xff1f; 一、下载通义灵码离线安装包 打开官网…

每日OJ题_贪心算法二⑤_力扣870. 优势洗牌(田忌赛马)

目录 力扣870. 优势洗牌&#xff08;田忌赛马&#xff09; 解析代码 力扣870. 优势洗牌&#xff08;田忌赛马&#xff09; 870. 优势洗牌 难度 中等 给定两个长度相等的数组 nums1 和 nums2&#xff0c;nums1 相对于 nums2 的优势可以用满足 nums1[i] > nums2[i] 的索引…

golang学习笔记(内存逃逸分析)

golang的内存逃逸 逃逸分析&#xff08; Escape analysis&#xff09; 是指由编译器决定内存分配的位置&#xff0c; 不需要程序员指定。 函数中申请一个新的对象。 如果分配在栈中&#xff0c; 则函数执行结束可自动将内存回收&#xff1b;如果分配在堆中&#xff0c; 则函数…

解决layui的bug 在layui tree 组件中 禁用选中父节点后自动选中子节点功能

最近做权限管理后台&#xff0c;用了layui tree 组件&#xff0c;发现选中了父节点后&#xff0c;自动选中了子节点。不满足现实业务需求。所以微调了下源代码。 在用树形组件中&#xff0c;在用文档中 tree.setChecked(demoId, [2, 3]); //批量勾选 id 为 2、3 的节点 用这句…

linux 服务器利用阿里网盘API实现文件的上传和下载

文章目录 背景脚本初始化 阿里云盘API工具 aligo安装aligoaligo教程实战parse.py 演示上传文件上传文件夹下载文件下载文件夹 背景 最近在用ubuntu系统做实验&#xff0c;而ubuntu 系统的文件上传和下载操作很麻烦&#xff1b; 于是便打算使用阿里网盘的API 进行文件下载与上传…

腾锐D2000-8 MXM VPX,全国产,可广泛应用于边缘计算网关、入侵检测、VPN、网络监控等等应用领域

腾锐D2000-8 MXM VPX 1. 概述 XMVPX-108 是一款基于飞腾 D2000/8 处理器的低功耗逻辑运算和图形处理 VPX 刀片&#xff0c; 板贴 32GB DDR4 内存&#xff0c;搭载飞腾 X100 套片&#xff0c;满足通用 IO 接口功能。GPU 采用 MXM 小型插卡形式&#xff0c; 搭配 8GB 显卡。提供…

NIO和NIO.2对比

Java NIO (New Input/Output) 是从Java 1.4版本开始引入的一个新的I/O API&#xff0c;用于替代原来的BIO&#xff08;Blocking I/O&#xff09;API。NIO提供了更加灵活和高效的网络通信方式&#xff0c;特别适合于高吞吐量的网络编程。NIO的主要特点是非阻塞模式&#xff0c;它…

3.4 无关、基和维度

这一节是关于子空间的真实大小。对于 m n m\times n mn 的矩阵&#xff0c;它有 n n n 个列&#xff0c;但是它真正的维数不一定为 n n n&#xff0c;维数可以由无关列的个数来得到。列空间的实际维度就是秩 r r r。 无关的概念是用于向量空间中的任意向量 v 1 , . . . ,…

【LAMMPS学习】八、基础知识(5.7)Drude感应偶极子

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

人工智能|推荐系统——工业界的推荐系统之召回

基于物品的协同过滤 ⽤索引,离线计算量⼤,线上计算量⼩ Swing额外考虑重合的⽤户是否来⾃⼀个⼩圈⼦,两个⽤户重合度⼤,则可能来⾃⼀个⼩圈⼦,权重降低。 基于用户的协同过滤 同样是离线计算索引,在线召回的流程 离散特征处理 Embedding 层参数数量=向量维度 类别数量 矩

DS高阶:图论算法经典应用

一、最小生成树&#xff08;无向图&#xff09; 在了解最小生成树算法之前&#xff0c;我们首先要先了解以下的准则&#xff1a; 连通图中的每一棵生成树&#xff0c;都是原图的一个极大无环子图&#xff0c;即&#xff1a;从其中删去任何一条边&#xff0c;生成树就不在连通&a…