深入理解字符串函数和字符函数(二)

目录

 

strstr 的使用和模拟实现​

简单的使用:

复杂情况下的使用

模拟实现strstr函数

用暴力求解的方式:

strtok的使用

strerror 函数的使用​


 

strstr 的使用和模拟实现​

作用:返回字符串在另外一个字符串中第一次出现的位置,即查找子串

  • 在字符串str1中查找是否存在与str2相等的子串

  • 如果存在,则返回一个地址(返回字符串str2在字符串str1中第⼀次出现的位置)

  • 如果不存在,则返回空指针

char * strstr ( const char * str1, const char * str2);
Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1.
(函数返回字符串str2在字符串str1中第一次出现的位置)。​
The matching process does not include the terminating null-characters, but it stops there.(字符串的比较匹配不包含 \0 字符,以 \0 作为结束标志)。

const char* str1:被查找目标字符串

const char* str2:要查找的对象字符串

简单的使用:

int main()
{char arr1[] = "abcdefabcdef";char arr2[] = "def";char* ret = strstr(arr1, arr2);if (ret != NULL){printf("%s\n", ret);}else {printf("找不到\n");}return 0;
}

<注:只要子串存在,strstr函数不仅打印出子串a2的内容,还会打印出子串arr2在arr1所处位置以后的所有字符 >

复杂情况下的使用

int main()
{char arr3[] = "abbbcdef";char arr4[] = "bbc";char* ret = strstr(arr3, arr4);if (ret == NULL) {printf("此字符串不存在,查找失败!\n");}else {printf("%s\n", ret);//bbcdef}
}

通过输出结果可知,ret的字符串为:"bbcdef"

当函数首先用指针str1指向a3的首字符时,

字符a不等于指针str2指向arr4字符串的字符b,str1会指向下一个字符进行寻找,

str1指向了字符b,发现与str2指向的相等,然后两个指针继续进行一次对比,又相等后,发现str1后的一个字符为b,而str2此时为c,不相等,再指向下一个字符进行比较

在str1再指向下一个字符时,对比成功,在这str1和str2数次对比后,str2已经指向了字符'\0'(),此时终止比较,返回值为str1中bbc后的所有内容。

模拟实现strstr函数

用暴力求解的方式:
  • const char* cur = str1; 初始化一个指针cur,指向源字符串str1的开始。

  • const char* s1 = NULL;const char* s2 = NULL; 初始化两个指针s1和s2,分别用于遍历源字符串和目标字符串。

  • assert(str1 && str2);//保证指针有效 通过assert确保传入的两个指针都是有效的。

  • if (*str2 == '\0') return (char*)str1; 如果目标字符串是空字符串,直接返回源字符串的地址。

  • while (*cur)//保证字符串cur即str1不为空 使用while循环遍历源字符串,直到遇到空字符'\0'。

  • s1 = cur; s2 = str2; 初始化s1和s2指针,分别指向当前遍历到的源字符串位置和目标字符串位置,替代源字符串,保证s1和s2的内容不变。

  • while (*s1 && *s2 && *s1 == *s2)//确保*s1和*s2不是'\0' 使用while循环遍历源字符串和目标字符串,直到两个指针都指向空字符,或者两个当前字符不相等。

  • if (*s2 == '\0') return (char*)cur; 如果目标字符串遍历完,返回当前源字符串的位置。

  • cur++; s2++; 移动指针cur和s2,指向下一个字符。

  • if (ret != NULL) 通过检查返回值判断是否找到了匹配的子字符串。

  • printf("%s\n", ret); 如果找到了匹配的子字符串,打印该子字符串。

  • else { printf("找不到\n"); } 如果没找到匹配的子字符串,打印"找不到"。

//暴力求解的方式
char* my_strstr(const char* str1,const char* str2)
{const char* cur = str1;const char* s1 = NULL;const char* s2 = NULL;assert(str1 && str2);//保证指针有效if (*str2 == '\0'){return (char*)str1;}while (*cur)//保证字符串cur即str1不为空{s1 = cur;s2 = str2;//确保*s1和*s2不是\0while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2 == '\0'){return (char*)cur;}cur++;}return NULL;
}
int main()
{char arr1[] = "abcdefabcdef";char arr2[] = "bcd";char* ret = my_strstr(arr1, arr2);if (ret != NULL){printf("%s\n", ret);}else {printf("找不到\n");}return 0;
}

还有一种是KMP求解法,以后会更新,望多多包涵

strtok的使用

strtok作用:字符串切割

char * strtok ( char * str, const char * sep);
• sep参数指向一个字符串,定义了用作分隔符的字符集合​
• 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
• strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。内部可能有静态变量)

• strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
• strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
• 如果字符串中不存在更多的标记,则返回 NULL 指针。

int main()
{char arr1[] = "zhangsan@163.com";char arr2[30] = { 0 };//zhangsan\0163\0comstrcpy(arr2, arr1);const char* p = "@.";char* s = NULL;//    初始化部分只执行一次for (s = strtok(arr2, p); s != NULL;s = strtok(NULL,p)){printf("%s\n", s);}return 0;
}
  • char arr1[] = "zhangsan@163.com";定义了一个字符数组 arr1,并将它初始化为字符串 "zhangsan@163.com"。

  • char arr2[30] = { 0 };定义了一个字符数组 arr2,长度为30,并将每个字符初始化为0。这里的0是空字符,意味着字符串的结束。

  • strcpy(arr2, arr1);使用 strcpy 函数将 arr1 的内容复制到 arr2。这样,arr2 就包含了与 arr1 相同的字符串。

  • const char* p = "@.";定义了一个常量字符指针 p,并将其指向字符串 "@."。这里的 "@." 是一个分隔符,它告诉 strtok 函数在哪里分割字符串。

  • char* s = NULL;定义了一个字符指针 s,并初始化为 NULL。

  • for (s = strtok(arr2, p); s != NULL; s = strtok(NULL,p));这是一个循环,它使用 strtok 函数来分割 arr2。首次调用时,strtok 会使用 p 中指定的分隔符来分割 arr2。之后每次调用,strtok 会继续在上一次分割的位置之后寻找下一个分隔符。当找不到更多分隔符时,strtok 返回 NULL,循环结束。

strerror 函数的使用​

char * strerror ( int errnum );

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。​
在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在 errno.h 这个头文件中说明的,C语言程序启动的时候就会使用一个全面的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会讲对应的错误码,存放在errno中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

这是打印0~9错误码的代码:

int main()
{int i = 0;for (i = 0; i < 10; i++){printf("%d:%s\n", i, strerror(i));}return 0;
}

今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

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

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

相关文章

奇数求和(C++)

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

HMM预习中文版

马尔可夫模型 在之前的笔记中&#xff0c;我们讨论了贝叶斯网络&#xff0c;以及它们如何被用于紧凑地表示随机变量之间的关系。现在&#xff0c;我们将介绍一个与之紧密相关的结构&#xff0c;称为马尔可夫模型&#xff0c;对于本课程的目的&#xff0c;可以将其视为类似于链…

前端量子纠缠 效果炸裂 multipleWindow3dScene

我 | 在这里 &#x1f575;️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; &#x1f383; 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 ✈️已经旅游的地点 | 新疆-乌鲁木齐、新疆-吐鲁番、广东-广州…

SELinux零知识学习三十七、SELinux策略语言之约束(1)

接前一篇文章:SELinux零知识学习三十六、SELinux策略语言之角色和用户(7) 四、SELinux策略语言之约束 SELinux对策略允许的访问提供了更严格的约束机制,不管策略的allow规则如何。 1. 近距离查看访问决定算法 为了理解约束的用途,先来看一下SELinux Linux安全模块(Lin…

Android : SQLite 增删改查—简单应用

示例图&#xff1a; 学生实体类 Student.java package com.example.mysqlite.dto;public class Student {public Long id;public String name;public String sex;public int age;public String clazz;public String creatDate;//头像public byte[] logoHead;Overridepublic St…

C#文件流FileStream类

目录 一、文件流类 1.FileStream类的常用属性 2.FileStream类的常用方法 3.使用FileStream类操作文件 二、文本文件的写入与读取 1.StreamWriter类 2.StreamReader类 3.示例及源码 三、二进制文件的写入与读取 1.BinaryWriter类 2.BinaryReader类 3.示例源码 数据流…

探究Kafka原理-7.exactly once semantics 和 性能测试

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44…

python基于YOLOv8全系列模型【n/s/m/l/x】开发构建不同参数量级的钢铁产业产品智能自动化检测识别系统

在前文的项目开发实践中&#xff0c;我们已经以钢铁产业产品缺陷检测数据场景为基准&#xff0c;陆续开发构建了多款目标检测模型&#xff0c;感兴趣的话可以自行阅读即可。 《YOLOv3老矣尚能战否&#xff1f;基于YOLOv3开发构建建钢铁产业产品智能自动化检测识别系统&#xf…

数据分析工具比较:Excel vs Python vs R

写在开头 在数据分析的世界里,选择合适的工具至关重要。本篇博客将深入比较常用的数据分析工具,包括Excel、Python和R,以帮助读者更好地选择适合自己需求的工具。 1.Excel:经典易用的电子表格 优势: 用户友好: Excel是大多数人熟悉的电子表格工具,使用简单,无需编程…

STM32之模数转换器ADC

目录 1、ADC介绍 1.什么是ADC&#xff1f; ADC的全称是Analog-to-Digital Converter&#xff0c;指模拟/数字转换器 2.ADC的性能指标 3.ADC特性 12位分辨率 4.ADC通道 5.ADC转换顺序 6.ADC触发方式 7.ADC转化时间 8.ADC转化模式 9.模拟看门狗 实验&#xff1a;使用ADC读…

fastjson 1.2.24 反序列化导致任意命令执行漏洞

漏洞描述 fastjson在解析json的过程中&#xff0c;支持使用autoType来实例化某一个具体的类&#xff0c;并调用该类的set/get方法来访问属性。 通过查找代码中相关的方法&#xff0c;即可构造出一些恶意利用链。 参考资料&#xff1a; 浅谈Fastjson RCE漏洞的绕过史 - FreeB…

Postgresql数据库运维统计信息

如果需要使用以下运维信息&#xff0c;需要如下几步 修改postgresql.conf文件 #shared_preload_libraries # (change requires restart)shared_preload_libraries pg_stat_statements重启数据库创建扩展 CREATE EXTENSION IF NOT EXISTS pg_stat_statements;1. 统计信息…

ArrayList与顺序表的简单理解

前言----list 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection。Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示&#xff1a; Iterable也是一个接口&#xff0c;表示实现该接口的类是可以逐个元素进…

鸿蒙4.0开发笔记之ArkTS语法基础@Entry@Component自定义组件的使用(九)

文章目录 一、自定义组件概述1、什么是自定义组件2、自定义组件的优点 二、创建自定义组件1、自定义组件的结构2、自定义组件要点3、成员变量的创建4、参数传递规则 三、练习案例 一、自定义组件概述 1、什么是自定义组件 在ArkUI中&#xff0c;UI显示的内容均为组件&#xf…

毫米波雷达DOA角度计算-----MUSIC算法

MUSIC算法如下&#xff1a; txNum &#xff1a;发射天线 2个 &#xff0c;rxNum&#xff1a;接收天线 4 个 。 ant &#xff1a; 为目标点的 天线 接收数据 &#xff0c; 为 8*1矩阵。 A ant;d 0.5;M 1; % # 快拍数ang_ax -90:90; % 角度坐标% 接收信号方向向量for k1:…

【Java学习笔记】73 - 正则表达式

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter27/src/com/yinhai/regexp 一、引入正则表达式 1.提取文章中所有的英文单词 2.提取文章中所有的数字 3.提取文章中所有的英文单词和数字 4.提取百度热榜标题 正则表达式是处理文本的利器…

C语言——输入两个正整数 m 和 n。求其最大公约数和最小公倍数。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int m, n;int i;int x 1;int y 0;printf("请输入两个正整数m和n&#xff1a;\n");scanf("%d,%d", &m, &n);for (i 1; i < m && i < n; i) {if (m % i 0 …

Java程序连接 nacos集群

我们在bootstrap.yml文件里可以直接连一个nacos集群的. 架构如下 没错,我们程序直连的是通过Nginx的,利用nginx的反向代理来做到连接nacos集群. 我们先把nginx的配置贴上来 upstream cluster{server 127.0.0.1:8848;server 127.0.0.1:8849;server 127.0.0.1:8850; }server{l…

软著项目推荐 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

基于SSM的高校学生实习管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…