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

目录

strstr 的使用和模拟实现​

简单的使用:

复杂情况下的使用

模拟实现strstr函数

用暴力求解的方式:

strtok的使用

strerror 函数的使用​


书接上文:深入理解字符串函数和字符函数(一)-CSDN博客

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.hqwc.cn/news/229553.html

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

相关文章

基于加拿大降水分析 (CaPA) 系统的北美区域确定性降水数据集

区域确定性降水分析 (RDPA) 基于加拿大降水分析 (CaPA) 系统的区域确定性降水分析 (RDPA) 的域与业务区域模式相对应&#xff0c;即区域确定性预报系统 (RDPS-LAM3D)&#xff0c;但太平洋地区除外其中 RDPA 域的西边边界相对于区域模型域稍微向东移动。RDPA 分析的分辨率与运行…

VT-MRPA1-151-1X/V0/0控制2FRE16模块式模拟放大器

适用于控制带有电气位置反馈的直动式比例减压阀&#xff08;DBETR- 1X 类型&#xff09;或带有电气位置反馈的比例流量控制阀&#xff08;2FRE... 类型&#xff09;&#xff1b;控制值输入 1 0 V&#xff08;差动输入&#xff09;&#xff1b; 可分别调节“上/下”斜坡时间的斜…

深度解读:为什么要做数据合规?如何做到数据合规?

数据资源“入表”在即&#xff0c;企业更需筑牢数据合规防线。但企业主企业购买数据、获取数据到底是否合法合规&#xff0c;入表如何防范合规风险&#xff1f;上周三&#xff0c;亿信华辰邀请到北京鑫诺律师事务所高级合伙人、管委会副主任武婕将和大家分享《数据入表法律合规…

C语言——I /深入理解指针(三)

一、字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* ; ⼀般使⽤: int main() { char ch w; char *pc &ch; *pc w; return 0; } 还有⼀种使⽤⽅式如下&#xff1a; int main() { const char* pstr "hello bit.";//这⾥是把⼀个字…

vue2通过权限控制tab标签显示和隐藏

vue2通过权限控制tab标签显示和隐藏 1、前言2、v-if实现自定义控制 1、前言 在开发过程中&#xff0c;我们可能会遇到这样一个场景&#xff1a;根据不同权限对tab栏内容进行控制&#xff0c;这时候用自定义指令v-permission就达不到我们想要的效果&#xff0c;其是将当前节点的…

0基础学习VR全景平台篇第124篇:VR视频地拍补地 - PR软件教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 嗨&#xff0c;大家好&#xff0c;今天我们来介绍【地拍VR视频补地】。 之前已经教给了大家如何处理航拍图片的补天和航天视频的补天&#xff0c;肯定有很多小伙伴也在好奇&…

unity的多语言配置工具

demo下载:https://github.com/JSumC/LanguageExcel using System; using System.Collections.Generic; using System.IO; using System.Linq; using OfficeOpenXml; using UnityEngine; using UnityEngine.UI; namespace LanguageExcel {public class LETool : MonoBehaviour{…

线下渠道应该如何控价

品牌渠道中的问题&#xff0c;大多跟价格有关&#xff0c;比如低价、窜货、假货&#xff0c;治理好这些价格问题&#xff0c;也就是在解决渠道中的低价问题&#xff0c;所以要先了解价格&#xff0c;再进行治理&#xff0c;这样的流程化操作&#xff0c;可以使品牌管控好渠道价…

【Python】数据分析案例:世界杯数据可视化 | 文末送书

文章目录 前期数据准备导入数据 分析&#xff1a;世界杯中各队赢得的比赛数分析&#xff1a;先打或后打的比赛获胜次数分析&#xff1a;世界杯中的抛硬币决策分析&#xff1a;2022年T20世界杯的最高得分者分析&#xff1a;世界杯比赛最佳球员奖分析&#xff1a;最适合先击球或追…

使用React+SpringBoot开发一个协同编辑的表格文档

本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 随着云计算和团队协作的兴起&#xff0c;协同编辑成为了许多企业和组织中必不可少的需求。通过协同编辑&#x…

重温 re:Invent,分享十年成长:我和 re:Invent的故事

文章目录 前言背景我和re:Invent的交际历届峰会主题2012 突破技术垄断2013 革新数据服务2014 更好用的云服务2015 打通最后一-公里2016 迈向云上数据湖时代2017 重构云计算基础2018 云能力的再进化2019 赋能企业云架构服务2020 推动行业数据库服务的演进2021 无可比拟的云架构2…

Ultipa参加国际科学会议KGSWC2023

近日&#xff0c;领先的国际科学会议 KGSWC 2023&#xff0c;在西班牙萨拉戈萨大学召开&#xff0c;Ultipa Graph参加。 KGSWC2023是第五届伊比利亚-美洲会议和第四届印度-美洲知识图谱与语义网大会的联合论坛。自2019年成立以来&#xff0c;KGSWC一直是一个重要的学术活动&am…