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

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

相关文章

每日一题SQL

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

【Qt QML 入门】TextField

TextField 是一个单行文本编辑器&#xff0c;它继承自TextInput&#xff0c;具备TextInput的所有功能&#xff0c;同时扩展了 TextInput 并增加了占位符文本功能和装饰选项。 自定义文本输入框&#xff1a; import QtQuick import QtQuick.Window import QtQuick.ControlsWindo…

OpenCvSharp从入门到实践-(07)绘制图形

目录 1、线段的绘制 1.1实例1-绘制线段拼成一个"王"字 2、矩形的绘制 2.1实例2-绘制一个矩形边框 2.2实例3-绘制一个实心矩形 3、圆的绘制 3.1实例4-绘制"交通灯" 4、多边形绘制 4.1实例5-绘制等腰梯形 5、文字的绘制 5.1实例6-绘制文字OpenCvS…

YB1161是一款高效同步升压转换器低至1pA的超低静态电流。

简介&#xff1a; YB1161是一款高效同步升压转换器低至1pA的超低静态电流。它能够从低电压源输送至少2W的功率&#xff0c;即。5V输出时为0.4A。它还具有真正的关闭功能在关闭和输出期间断开输入和输出短路条件。这消除了对外部MOSFET及其控制电路&#xff0c;用于断开输入输出…

亚信科技AntDB数据库——深入了解AntDB-M元数据锁的实现(二)

5.5 防止低优先级锁饥饿 AntDB-M按照优先级将锁又分了两类&#xff0c;用于解决低优先级锁饥饿问题。 ●独占型(hog): X, SNRW, SNW; 具有较强的不兼容性&#xff0c;优先级高&#xff0c;容易霸占锁&#xff0c;造成其他低优先级锁一直处于等待状态。 ●暗弱型(piglet): SW; …

Vue3报错: ‘defineProps‘ is not defined,解决方法

问题出现: 今天在使用 <script setup>组合式 API 的语法糖的时候&#xff0c;定义defineProps时候报错&#xff1a; ‘defineProps’ is not defined 查了一下资料&#xff0c;这是因为eslint的语法校验导致的问题。 解决方法1&#xff1a; 在项目根目录的文件.eslin…

【Linux | Docker】内网穿透实现远程访问Nginx Proxy Manager

文章目录 前言1. docker 一键安装2. 本地访问3. Linux 安装cpolar4. 配置公网访问地址5. 公网远程访问6. 固定公网地址 前言 Nginx Proxy Manager 是一个开源的反向代理工具&#xff0c;不需要了解太多 Nginx 或 Letsencrypt 的相关知识&#xff0c;即可快速将你的服务暴露到外…

Python+reuqests自动化接口测试

1.最近自己在摸索Pythonreuqests自动化接口测试&#xff0c;要实现某个功能&#xff0c;首先自己得有清晰的逻辑思路&#xff01;这样效率才会很快&#xff01; 思路--1.通过python读取Excel中的接口用例&#xff0c;2.通过python的函数调用&#xff0c;get/Post 进行测试&…

如何培养孩子的自信心

当谈论培养孩子的自信心时&#xff0c;许多家长可能会感到困惑。自信心是一个孩子成长过程中非常重要的品质&#xff0c;它可以帮助孩子在面对挑战时更加勇敢和坚定。那么&#xff0c;如何培养孩子的自信心呢&#xff1f;以下是一些建议&#xff0c;希望能对您有所帮助。 鼓励孩…

imazing是什么软件

imazing是什么软件 iMazing 是世界上最值得信赖的软件,可以将您的信息、音乐、文件和数据从 iPhone 或 iPad 传输到您的 Mac 或 PC。 获得备份、数据提取、媒体和文件传输的强大能力,以及更多 iMazing 功能。 iMazing是一款第三方的苹果iOS设备管理软件。 iMazing- 2 Mac-安装…

git的分支的使用,创建分支,合并分支,删除分支,合并冲突,分支管理策略,bug分支,强制删除分支

GIT | 分支 文章目录 GIT | 分支创建分支合并分支删除分支合并冲突分支管理策略bug分支强制删除分支 创建分支 查看当前本地仓库中有哪些分支 git branchHEAD所指向的分支就是当前正在工作的分支 cat .git/HEAD创建一个分支 git branch dev创建好了&#xff0c;但是目前还是…

学习黑马vue

项目分析 项目下载地址&#xff1a;vue-admin-template-master: 学习黑马vue 项目下载后没有环境可参考我的篇文章&#xff0c;算是比较详细&#xff1a;vue安装与配置-CSDN博客 安装这两个插件可格式化代码&#xff0c;vscode这个软件是免费的&#xff0c;官网&#xff1a;…