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

server/2024/9/20 1:17:17/ 标签: java, 算法, 数据结构

遇见她如春水映莲花

字符函数与字符串函数(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.ppmy.cn/server/31783.html

相关文章

数列与极限(下)

数列与极限 幂级数 定义 3.38 设有复数序列 { c n } \left\{ c_{n} \right\} {cn​}&#xff0c;级数 ∑ n 0 ∞ c n z n \sum_{n0}^{\infty} c_{n} z^n n0∑∞​cn​zn 叫做幂级数(power series)。 c n c_{n} cn​叫做这级数的系数(coefficients)&#xff1b; z z z是复数…

IDEA2024版本控制台乱码怎么解决?

在使用最新版本的IDEA时&#xff0c;可能会遇到控制台输出乱码问题&#xff1f; 在网上找了很多办法&#xff0c;修改了IDEA的vmoptions文件也没有用,最后发现原来是要修改这里 Setting>>Build&#xff0c;Execution,Deployment>>Runnr中的VM Options配置&#xf…

Oracle23ai来了,23爱,全能、超级巨兽...

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

有限单元法-编程与软件应用(崔济东、沈雪龙)【PDF下载】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

【QEMU系统分析之实例篇(十三)】

系列文章目录 第十三章 QEMU系统仿真的机器创建分析实例 文章目录 系列文章目录第十三章 QEMU系统仿真的机器创建分析实例 前言一、QEMU是什么&#xff1f;二、QEMU系统仿真的机器创建分析实例1.系统仿真的命令行参数2.完成早期后端驱动的设置工作qemu_create_early_backends(…

手写一个uart协议——rs232

先了解一下关于uart和rs232的基础知识 文章目录 一、RS232的回环测试1.1模块整体架构1.2 rx模块设计1.2.1 波形设计1.2.2代码实现与tb1.2.4 仿真 1.3 tx模块设计1.3.1 波形设计1.3.2 代码实现与tb1.3.4 顶层设计1.3.3 仿真 本篇内容&#xff1a; 一、RS232的回环测试 上位机…

算法提高之货币系统

算法提高之货币系统 核心思想&#xff1a;背包 贪心 贪心思路&#xff1a;将a从小到大排序&#xff0c;因为a数组中数如果能用之前的数线性表示则它一定没用 所以对每一个数 求其是否能用前i-1个数表示&#xff08;背包求方案数&#xff09;如果不能被其他数表示 就加入到b数组…

Django后台项目开发实战五

完成两个功能&#xff1a; HR 可以维护候选人信息面试官可以录入面试反馈 第五阶段 创建 interview 应用&#xff0c;实现候选人面试评估表的增删改功能&#xff0c;并且按照页面分组来展示不同的内容&#xff0c;如候选人基础信息&#xff0c;一面&#xff0c;二面的面试结…

【JVM】Java工具(Arthas,APM,Java Agent,JMX)

Java工具 常见的Java工具有以下几类&#xff1a; 1、诊断类工具&#xff0c;如Arthas、VisualVM等。 2、开发类工具&#xff0c;如Idea、Eclipse。 3、APM应用性能监测工具&#xff0c;如Skywalking、Zipkin等。 4、热部署工具&#xff0c;如Jrebel等。 Arthas中 Java Ag…

初识MVC

初识MVC 理论部分 今天第一次学MVC&#xff0c;拿到一个练手项目。现在来记录一下学习过程。 项目的背景就是个学生管理系统。我只做后端。 从大的来说MVC将应用程序分为三个主要组件&#xff08;部分&#xff09;&#xff1a; 模型&#xff08;Model&#xff09;是应用程序…

Springboot 学习之数据库配置项加密工具:ulisesbocchio

在 springboot 项目中&#xff0c;我们为了规避安全漏洞的问题&#xff0c;要对数据库连接的用户名和密码等信息加密处理。ulisesbocchio 是一款好用的加密插件&#xff0c;下面分享一下使用方法。 一.配置 mavan 依赖&#xff0c;直接使用 spring-boot-starter 方式 <depe…

定点小数_

目录 定点小数表示和运算 定点小数的原码 定点小时加减法运算 定点小数 vs 定点整数 定点小数表示和运算 定点小数的原码 定点小数原反补转换 定点小时加减法运算 定点小数 vs 定点整数 定点小数原码依然是 取值范围等比数列 符号位 定点小数 同样的:

tensorflow_decision_forests\tensorflow\ops\inference\inference.so not found

恰好有一个帖子提到了py3.10里面的解决方案 pip install --user tensorflow2.11.0My tensorflow version is 2.11.0 and my tensorflow_decision_forests version is 1.2.0 so those should be compatible. I also am using Python version 3.10.11原文链接&#xff1a; http…

创建和激活python虚拟环境(venv), 以及在vscode上运行python虚拟环境

最近使用python做项目&#xff0c;发现佬们都是在用python的虚拟环境来放项目。发现确实有一些优势在这之中&#xff0c; 首先就是隔离性&#xff0c;我们将每个项目放入相对应的环境配置&#xff0c;可以有效避免乱七八糟的库出现在解释器中。其次就是可移植性强&#xff0c;…

【C++风云录】图形和动作捕捉库全面解析:从OpenPose到OpenCV

深入浅出&#xff1a;六大计算机视觉和动作捕捉库的教程和比较 前言 本文将为读者详细介绍六种在计算机视觉领域广泛使用的开源软件和SDK&#xff0c;包括OpenPose、Vicon SDK、Intel RealSense SDK、Microsoft Kinect SDK、PCL (Point Cloud Library)和OpenCV。我们会一一解…

【前端学习——call和apply函数】

call()和apply()这两个方法的作用可以简单归纳为改变this指向&#xff0c;从而让我们的this指向不在是谁调用了函数就指向谁。 call()方法的作用和 apply() 方法类似&#xff0c;区别就是call()方法接受的是参数列表&#xff0c;而apply()方法接受的是一个参数数组。 https:/…

用C#写一个特性,在函数上面可以自动计算函数耗时情况

用C#写一个特性&#xff0c;在函数上面可以自动计算函数耗时情况 TimingAttribute类是自定义的特性类&#xff0c;用来标记需要计时的方法。TimingInterceptor类是一个拦截器&#xff0c;它通过反射来拦截被TimingAttribute标记的方法&#xff0c;并在方法执行前后进行计时。My…

面试题分享之Java集合篇(三)

注意&#xff1a;文章若有错误的地方&#xff0c;欢迎评论区里面指正 &#x1f36d; 系列文章目录 面试题分享之Java基础篇&#xff08;二&#xff09;面试题分享之Java基础篇&#xff08;三&#xff09; 面试题分享之Java集合篇&#xff08;一&#xff09;、 面试题分享之Ja…

Java 基础面试 -- 异常处理

一、引言 在Java编程中&#xff0c;异常处理是确保程序稳定性和健壮性的重要机制。当程序在运行时遇到不可预见的问题&#xff0c;如文件读取失败、网络错误、除零异常等&#xff0c;异常处理机制允许我们捕获这些错误&#xff0c;并进行相应的处理&#xff0c;从而避免程序崩…

SQL-慢查询的定位及优化

定位慢查询sql 启用慢查询日志&#xff1a; 确保MySQL实例已经启用了慢查询日志功能。可以通过以下命令查看是否启用&#xff1a; SHOW VARIABLES LIKE slow_query_log;如果未启用&#xff0c;可以通过以下命令启用&#xff1a; SET GLOBAL slow_query_log ON;配置慢查询日志&…