strtok()的用法及实现哦

1. 用法

1. 声明:char *strtok(char *str, const char *delim)

  • str -- 要被分解成一组小字符串的字符串。第一次调用 strtok() 时,这个参数应该是你想要分割的字符串。随后的调用应该将此参数设置为NULL,以便继续从上次的位置分割。
  • delim -- 包含分隔符的 C 字符串。

2. 作用:strtok() 用于将字符串分割成一系列的子串

3. 返回值:该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。

     贝蒂说:“如果一下子没有明白,不要但心,继续跟着贝蒂看看例子就明白啦~”  

 2. 实例

#include <string.h>
#include <stdio.h>
int main() 
{char str[80] = "This is - betty -@class";const char s[] = "-@";char* p = strtok(str, s);//第一次传参while (*p != NULL){printf("%s\n", p);p = strtok(NULL, s);//非第一次传参}return 0;
}

输出结果:

This is
 betty
 class 

    简单来说:“strtok()就是把从目标字符串中,以分隔符为标志,将其分成若干个子串,并且需要多次调用” 

3. 实现 

思路分析:

第一步:

先判断是否为第一次传入 

第二步:

分割起始的分割符,我们先假设需要在“@+abc”中切割“@+”

  1. 首先判定p1中首元素是否需要切割(在p2中排查直到遇见‘\0’)。

  2. 如果匹配成功,让pp+1指向下一个元素,让p3重新指向p2的首元素,继续排查下一个元素。

  3. 如果排查失败,p2或pp指向‘\0’,如果p2指向'\0',说明起始位置的分割符排查成功,如果pp指向‘\0’,说明没有再分割的字符串,返回NULL。

assert(p2);//防止p2为空指针
static char* pp= NULL;//static修饰,延长其生命周期
//让其第二次调用时后能指向下一个字符串
char* ret = NULL;//作为返回值
char* p3 = (char*)p2;//记录p2的初始位置
if (p1 != NULL)
{pp = p1;//第一次传入
}
while (*pp && *p2)//排除起始的分割符
{if (*p2 == *pp){pp++;p2 = p3;//成功找到再重新匹配}else{p2++;//匹配下一个字符}
}

 第三步:

 分割后续字符串,我们假设在“ab@cd”中分割“@”。

ret = pp;//记录初始位置,方便返回
p2 = p3;//让p2指向初始位置
while (*pp && (*pp!= *p2++))//开始匹配
{if (*p2=='\0'){pp++;//判断下一个字符p2 = p3;//让p2重新开始匹配}
}
if (*pp)//判断是不是'\0'
{*pp++ = '\0';//分割字符串,并指向下一个字符
}
return ret;

 第四步:

当非第一步传入时,*pp==‘\0’时,说明分割结束,返回NULL.

if (p1 == NULL && pp=='\0')//查找完毕
{return NULL;//最后返回空指针
}

完整代码:
 

#include <assert.h>
#include <stdio.h>
char* my_strtok(char* p1, const char* p2)
{assert(p2);//防止p2为空指针static char* pp= NULL;//static修饰,延长其生命周期//让其第二次调用时后能指向下一个字符串char* ret = NULL;//作为返回值char* p3 = (char*)p2;//记录p2的初始位置if (p1 == NULL && pp=='\0')//查找完毕{return NULL;//最后返回空指针}if (p1 != NULL){pp = p1;//第一次传入}while (*pp && *p2)//排除起始的分割符{if (*p2 == *pp){pp++;p2 = p3;//成功找到再重新匹配}else{p2++;//匹配下一个字符}}if (*pp = '\0'){return NULL;//第一次排查指向'\0'}ret = pp;//记录初始位置,方便返回p2 = p3;//让p2指向初始位置while (*pp && (*pp!= *p2++))//开始匹配{if (*p2=='\0'){pp++;//判断下一个字符p2 = p3;//让p2重新开始匹配}}if (*pp)//判断是不是'\0'{*pp++ = '\0';//分割字符串,并指向下一个字符}return ret;
}

贝蒂说:“这应该算是字符串函数最难实现的吧,贝蒂思考了好久的说~”

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

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

相关文章

接口自动化测试框架搭建

一、原理及特点 参数放在XML文件中进行管理用httpClient简单封装一个httpUtils工具类测试用例管理使用了testNg管理&#xff0c;使用了TestNG参数化测试&#xff0c;通过xml文件来执行case。测试报告这里用到第三方的包ReportNG 项目组织用Maven 二、准备 使用工具&#xff1…

SecureCRT设置log保存路径和格式

SecureCRT设置log保存路径和格式 D:\CRT.log%S%Y%M%D-%h%m%s.log [%Y%M%D_%h:%m:%s] [%h:%m:%s]

AJAX练习题:加强你的异步通信技能!

学习目标&#xff1a; 创建一个AJAX请求&#xff0c;从服务器获取一个JSON对象&#xff0c;并将其显示在网页上。 创建一个AJAX请求&#xff0c;向服务器发送数据并获取响应。使用获取到的响应数据更新网页上的内容。 创建一个AJAX请求&#xff0c;从服务器获取一个XML文件&a…

HBase 详细图文介绍

目录 一、HBase 定义 二、HBase 数据模型 2.1 HBase 逻辑结构 2.2 HBase 物理存储结构 ​2.3 数据模型 2.3.1 Name Space 2.3.2 Table 2.3.3 Row 2.3.4 Column 2.3.5 Time Stamp 2.3.6 Cell 三、HBase 基本架构 架构角色 3.1 Master 3.2 Region Server 3.3 Zo…

【DC-DC】世微 AP9166 降压恒压芯片 18V 2A同步降压转换器

600KHz&#xff0c;18V&#xff0c;2A同步降压转换器 概述 AP9166是一款完全集成的效率2A同步整流降压转换器。AP9166运行在宽输出电流上以高效率 负载范围。此设备提供两个操作模式、PWM控制和PFM模式切换控制&#xff0c;允许更宽范围的高效率 负载AP9166至少需要现成标准的…

基于ssm的汽车服务商城系统设计与实现论文

摘 要 本课题是根据用户的需要以及网络的优势建立的一个基于Vue的汽车服务商城系统&#xff0c;来更好的为用户提供服务。 本基于Vue的汽车服务商城系统应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于SSMVue框架开发。在网站的整个开发过程中&#xff0c;首先对…

坚持创新驱动,超卓航科入选为“新一批国家知识产权优势企业”!

近日&#xff0c;根据《国家知识产权局关于确定2023年新一批及通过复核的国家知识产权示范企业和优势企业的通知》精神&#xff0c;经湖北省知识产权局组织测评、推荐&#xff0c;国家知识产权局审核&#xff0c;超卓航科入选为“新一批国家知识产权优势企业”。 超卓航科以金属…

IDEA debug窗口左边工具栏隐藏与显示

今天在debug排查代码的时候一不小心点到哪里&#xff0c;结果变成这样 我们可以这样恢复&#xff0c;右键Debug 点击show Toolbar

java的内存图

明确&#xff1a;jre jdk jvm关系 (详细去看这篇文章&#xff09; 三者的大致结构是这样的&#xff0c;简单来说就是JDK包含JRE,JRE又包含JVM的关系。如下图所示&#xff1a; 从图中可以看出JDK是整个JAVA的核心&#xff0c;包括了Java运行环境JRE&#xff08;Java Runtime E…

【ThemeStudio】安装报错A Javascript error occurred in the main process

报错内容: 问题原因&#xff1a;系统环境缺少microsoft visual c插件 解决方法&#xff1a; 下载 微软VC 地址

Docker——2. Docker基础

1. 常见命令 不用重复使用docker run命令&#xff0c;这是创建容器命令&#xff0c;启动容器应该是docker start&#xff1b; docker ps 查看进程运行状态&#xff1b; docker rmi 删除镜像、rm 删除容器&#xff1b; docker logs 查看日志、docker exec 执行命令进入容器内部&…

19.(vue3.x+vite)v-if和v-for哪个优先级更高

前端技术社区总目录(订阅之前请先查看该博客) v-if和v-for哪个优先级更高 (1)实践中不应该把v-for和v-if放一起,可以包一层template (2)在vue2中,v-for的优先级是高于v-if (3)在vue3中,v-for的优先级是低于v-if 组件代码 <template><div><!--包一…

[Linformer]论文实现:Linformer: Self-Attention with Linear Complexity

文章目录 一、完整代码二、论文解读2.1 介绍2.2 Self-Attention is Low Rank2.3 模型架构2.4 结果 三、整体总结 论文&#xff1a;Linformer: Self-Attention with Linear Complexity 作者&#xff1a;Sinong Wang, Belinda Z. Li, Madian Khabsa, Han Fang, Hao Ma 时间&#…

浏览器输入URL再按下回车会经历哪些过程

目录 前言 一、解析URL 二、解析域名(DNS) 三、TCP三次握手建立连接 1.seq、syn、ack含义 2.三次握手 四、发送http/https请求 五、服务器响应请求 六、浏览器解析渲染页面 七、TCP四次挥手断开连接 总结 前言 看各种面经发现这个问题是一个高频出现的面试问题&#xff0c;但…

每日一题SQL

以下题目来源微信公众号【SQL数据库开发】 1、编写一个 SQL 查询来实现分数排名。如果两个分数相同&#xff0c;则两个分数排名&#xff08;Rank&#xff09;相同。请注意&#xff0c;平分后的下一个名次应该是下一个连续的整数值。换句话说&#xff0c;名次之间不应该有“间隔…

四十五、Redis主从

目录 1、数据同步原理 &#xff08;1&#xff09;全量同步 &#xff08;2&#xff09;增量同步 &#xff08;3&#xff09;优化Redis主从集群 &#xff08;4&#xff09;什么时候执行全量同步 &#xff08;5&#xff09;什么时候执行增量同步 2、流程 1、数据同步原理 &…

Salesforce“卷土重来”:对中国CRM市场影响在哪?

于本土CRM而言&#xff0c;Salesforce是一面镜子&#xff0c;也更是催化剂。 长期来看&#xff0c;Salesforce的加入&#xff0c;从某种程度上将会加速中国CRM赛道的合理价值曲线的走向&#xff0c;通过带动外界对于CRM整个赛道的关注和热度&#xff0c;进而加速本土CRM的成长…

在vue项目中,数据已经在页面渲染,但在后续操作时获取不到数据

如下图 产生这个问题的原因 异步问题 如何解决 方法一&#xff1a;可以将其存放在一个setTimeout里面&#xff08;利用一个极小的延迟来获取数据&#xff09;&#xff0c;如下图 效果 方法二&#xff1a;将操作放入axios里面&#xff0c;如下图

心理学效应

条柠檬心理马太效应飞轮效应酸葡萄效应凡勃伦效应登门槛效应糖果效应南风效应野马效应聚光灯效应毛毛虫效应曝光效应

【Matlab】如何使用MATLAB可视化二重积分(附完整MATLAB代码)

可视化二重积分 前言正文完整代码代码实现可视化结果 前言 二重积分是指在二维空间中对函数进行积分。二重积分的公式如下&#xff1a; ∫ a b ∫ c d f ( x , y ) d x d y ∫_a^b ∫_c^d f(x, y) dx dy ∫ab​∫cd​f(x,y)dxdy 其中&#xff0c; a a a 和 b b b 是 x x x…