字符串拆分函数strtok实现对字符串的拆分

2023-05-16

前言:在本章,将介绍如何通过strtok函数来分隔字符串。

问:现有一段字符串"chatgpt@wenxin.baidu",如何才能将@ .去掉打印出剩下的部分呢?

下面将先介绍strtok函数。

strtok

功能:通过指定的分隔符拆分字符串。

splusplus对其介绍如下:(只选取了参数部分,重点我将在下面讲解)

在这里插入图片描述

strtok有2个参数,第二个参数delimiters(分隔符)是个字符串,定义了用作分隔符的字符的集合,第一个参数str指定一个字符串,它包含了0个或多个由delimiters字符串中一个或者多个分隔符的标记。

strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可以修改。(不要写成常量字符串,因其不可修改)
1.strtok函数找到str中的下一个标记,并将该标记用\0结尾,然后返回一个指向该标记的指针。
2.strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,strtok函数将保存它在字符串中的位置.
3.strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记
4.在第一次调用时,该函数需要一个C字符串作为字符串,其第一个字符用作扫描标记的起始位置。在随后的调用中,该函数需要一个空指针,并使用最后一个标记末尾之后的位置作为扫描的新起始位置。
ps:黄色部分为理解strtok函数的重点,第一点为strtok函数的工作原理,第2第3点则是strtok函数的两种不同的情况.

下面我将通过一段代码循序渐进的深入讲解上面3点

1.

#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = "chatgpt@wenxin.baidu";  //指定字符串
	char arr[30];
	strcpy(arr, str);     //拷贝一份临时的指定字符串,以避免改变str
	char* p = "@.";       //指定的分隔符(标记)
	char* tmp = strtok(arr, p);  //使用一次strtok,因其返回的是一个指针,所以用字符指针接收
	printf("%s\n", tmp);    //会打印出什么呢?
	return 0;
}

打印结果如下:
在这里插入图片描述

解释:上文黄色部分第一点提过:1.strtok函数找到str中的下一个标记,并将该标记用\0结尾,然后返回一个指向该标记的指针.
在这里插入图片描述

2.

代码并未完结,我们往下续写:

#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = "chatgpt@wenxin.baidu";  //指定字符串
	char arr[30];
	strcpy(arr, str);     //拷贝一份临时的指定字符串,以避免改变str
	char* p = "@.";       //指定的分隔符(标记)
	char* tmp = strtok(arr, p);
	printf("%s\n", tmp);    
	//以下为续写部分	
	tmp = strtok(NULL, p); //此时的第一个参数为NULL,为什么呢?
	printf("%s\n", tmp);   //打印如何?
	return 0;
}

此时的打印结果如下:
在这里插入图片描述

到这里,有人或许会有以下2点疑问:
1.为什么传的是空指针呢?
2.第一个参数传了空指针,那strtok是怎么还能找到我后面的内容的呢?

下面对它们逐个解释:

第一点:我们之前使用过了一次strtok函数,它对标的是黄色部分的第4点:在第一次调用时,该函数需要一个C字符串作为字符串,其第一个字符用作扫描标记的起始位置。在随后的调用中,该函数需要一个空指针,并使用最后一个标记末尾之后的位置作为扫描的新起始位置。
第二点:对标的是黄色部分的第2第3点:2.strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,strtok函数将保存它在字符串中的位置. 3.strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记 第2点后半句strtok函数将保存它在字符串中的位置,而第3点后半句strtok函数将在同一个字符串中被保存的位置开始,查找下一个标记. 我们知道:函数是在栈区创建了=的,出了栈区就会立即销毁,而strtok函数却拥有记忆功能(出了栈区也未被销毁),这不正与static的作用相同吗?
在这里插入图片描述

3.

最后的步骤与第二步差不多,参数都是空指针

#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = "chatgpt@wenxin.baidu";  //指定字符串
	char arr[30];
	strcpy(arr, str);     //拷贝一份临时的指定字符串,以避免改变str
	char* p = "@.";       //指定的分隔符(标记)
	//1
	char* tmp = strtok(arr, p);
	printf("%s\n", tmp);
	//2
	tmp = strtok(NULL, p);
	printf("%s\n", tmp);
	//以下为续写部分
	tmp = strtok(NULL, p);  //与第二步步骤相同
	printf("%s\n", tmp);
	return 0;
}

此时的打印结果如下:
在这里插入图片描述

至此,文章开头提出得问题视乎得到了解决?但是上述代码仅为方便读者理解才这样写的.
不知读者们有没有思考以下问题:

上面是有3个分隔符,所以我们用了3次strtok,但若是标记数量不是3个呢?
比如"ab@cd.ef@hi.jk"这里面就有四个分隔符(假定分隔符为@.).难道我们要一直重复写下去?

4.最终修改(文章核心代码呈现,上文看不明白的朋友记住以下如何用的即可)

将通过一个for循环达到目的

#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = "chatgpt@wenxin.baidu";  //指定字符串
	char arr[30];
	strcpy(arr, str);     //拷贝一份临时的指定字符串,以避免改变str
	char* p = "@.";       //指定的分隔符(标记)
	char* tmp = NULL;     //创建一个字符指针变量
	for (tmp = strtok(arr, p); *tmp != NULL; tmp = strtok(NULL, p))
	{
		printf("%s\n",tmp);
	}
	return 0;
}

for循环的第一个初始条件为strtok(想拆分的字符串,分隔符),
第3个调整条件为strtok(NULL,分隔符), 因为只有在第一次使用strtok时第一个参数才为想拆分的字符串,其后使用strtok第一个参数都是NULL,
第2个判断条件为*tmp!=NULL,读取到最后没有字符,则判断条件不成立,那么停止循环.

文末BB:对哪里有问题的朋友,可以在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,如果对朋友们有帮助的话,希望能给点点赞和关注.
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符串拆分函数strtok实现对字符串的拆分 的相关文章

  • VNC可实现屏幕共享

    第一步 第二歩 第三步第四步 第五步 第六步 第七步
  • coco2017数据标签格式转到VOC2007格式

    以下代码是将coco2017数据集标签格式转到voc2007格式的代码 span class token operator span span class token operator span span class token opera
  • C库函数 ——strstr、strtok的详解

    x1f48c 内容专栏 xff1a C语言 进阶部分 x1f48c 本文概括 xff1a 理解C语言库函数strstr strtok的功能 x1f48c 本文作者 xff1a 花 碟 x1f48c 发布时间 xff1a 2023 3 14
  • 用Energia烧写MSP430F5529出现问题

    先前使用MSP430G2553的板子上传程序 xff0c 都没有问题的因为管脚太少了 xff0c 而选择使用MSP430F5529 xff0c 但第一个程序一烧写 xff0c 就出现了问题 xff0c 一直都不明白哪里有问题 xff0c 还
  • 修改mysql密码的四种方法

    方法1 xff1a 用SET PASSWORD命令 首先登录MySQL 格式 xff1a mysql gt set password for 用户名 64 localhost 61 password 新密码 例子 xff1a mysql g
  • 云计算赛项私有云服务搭建(最新版比赛步骤超详细)

    openstack平台搭建基础 题目 1 基础环境搭建 使用提供的用户名密码 xff0c 登录提供的 OpenStack 私有云平台 xff0c 在当前租户下 xff0c 使用 CentOS7 9 镜像 xff0c 创建两台云主机 xff0
  • 树莓派:使用VNC+远程桌面登录+一些无法登录问题及解决

    目录 一 VNC登录1 下载VNC2 VNC登录操作2 VNC无法登录的问题以及解决方法 xff01 二 xrdp远程桌面登录 xff08 建议 xff1a 如果VNC可以进去 xff0c 建议不要捣鼓远程桌面 xff0c 二者选其一 xf
  • 【算法基础三】算法如何入门?零基础入门算法应该学些什么?

    作者简介 xff1a 大家好 我是新小白2022 xff0c 让我们一起学习 xff0c 共同进步吧 xff01 x1f3c6 x1f4c3 个人主页 xff1a 新小白2022的CSDN博客 x1f525 系列专栏 xff1a 算法基础入
  • 51单片机学习:蜂鸣器实验

    实验名称 xff1a 蜂鸣器实验 接线说明 xff1a 实验现象 xff1a 下载程序后蜂鸣器发出声音 xff0c 一段时间后关闭 注意事项 xff1a include 34 reg52 h 34 typedef unsigned int
  • isalnum()

    isalnum 判断一个字符是否是字母或数字 int isalnum int c isalnum 函数用来检测一个字符是否是字母或者十进制数字 如果仅仅检测一个字符是否是字母 xff0c 可以使用 isalpha 函数 xff1b 如果仅仅
  • 云计算与大数据实验五 MapReduce编程

    一 实验目的 了解Mapper类 xff0c Reducer类和Job类 掌握什么是MapReduce及使用MapReduce进行运算 掌握挖掘父子辈关系 xff0c 给出祖孙辈关系的表格 二 实验内容 使用Map Reduce计算班级中年
  • 获取网页相关图片

    获取网页上相关图片 span class token operator span span class token operator span span class token operator span coding span class
  • Maven项目缺少Maven Dependencies解决方法总结

    一 今天搭建了一个maven项目 xff0c 在pom xml文件引入依赖后 xff0c 发现项目结构中没有Maven Dependencies文件 xff08 下图 xff09 xff0c 但是在java Build Path中又可以找到
  • 基于STM32智能窗帘

    基于STM32智能窗帘系统 1 可以检测环境中温湿度 烟雾浓度 一氧化碳浓度 xff0c 光照强度 超过阈值蜂鸣器报警 xff0c 或者控制灯的开关 xff0c 同时把测量的一氧化碳浓度 光照强度 光照强度阈值 xff0c 温湿度显示在ol
  • strtok函数

    头文件 string h 函数声明 char strtok xff08 char str xff0c const sep xff09 返回值 分隔符之前字符串的首地址 用法 sep的参数是个字符串 xff0c 定义了用作分隔符的字符集合st
  • Hadoop中DataNode无法打开的解决

    当遇到使用jps命令无法启动DataNode时 xff0c 可尝试以下操作 首先关闭hdfs cd到root用户下的hadoopdata目录 xff0c 打开该目录 该目录中在NameNode安装初始化时自动生成个 两个相对应的目录data
  • JS中猜数字游戏

    程序随机生成一个1 10之间的数字 xff0c 并让用户输入一个数字 xff0c 如果大于该数字 xff0c 就提示 xff0c 数字大了 xff0c 继续猜 如果小于该数字 xff0c 就提示数字小了 xff0c 继续猜 如果等于该数字
  • 移动端HTML开发(模仿京东移动端)

    制作过程中问题总结 xff1a 1 对于body特殊设置解释 body width 100 margin 0 auto min width 320px max width 640px font size 14px font family a
  • 获取dom页面文档对象的5种方法~js篇

    1 通过ID获取 xff1a document getElementById ID名 注意点 xff1a 因为我们文档页面从上往下加载 xff0c 所以先得有标签所以我们script写到标签的下面get 获得element 元素by 通过驼
  • 节点操作~JS

    2 节点操作 A 动态创建节点的三种方法 xff1a 1 document write 注意 xff1a 页面文档流加载完毕 xff0c 再调用就会导致页面重绘 2 element innerHTML将内容写入某个dom节点 xff0c 不

随机推荐

  • 删除数组元素方法

    1 length JavaScript中Array的length属性非常有特点一一它不是只读的 因此 xff0c 通过设置这个属性可以从数组的末尾移除项或添加新项 var colors 61 34 red 34 34 blue 34 34
  • ubuntu中ifconfig命令无效

    许多windows非常熟悉ipconfig命令行工具 xff0c 它被用来获取网络接口配置信息并对此进行修改 Linux系统拥有一个类似的工具 xff0c 也就是ifconfig interfaces config 通常需要以root身份登
  • JS中~定时器

    一 window对象常见事件 window onload是窗口 页面 xff09 加载事件 当文档内容完全加载完成会触发该事件 包括图像 脚本文件 CSS文件等 就调用的处理函数 注意 1 有了window onload就可以把JS代码写到
  • ubuntu磁盘信息查看命令

    1 命令控制行切入U盘目录中 dev 设备驱动文件 media 此目录下放置可插拔设备 xff0c 比如SD卡 xff0c 或者U盘就是挂载到这个目录中 首先要切换到 dev目录中寻media寻用户找到相关U盘 如上便可切入相应U盘 2 根
  • 【SLAM-建图】Ubuntu18.04安装cartographer记录

    1 更新和安装相关工具 sudo apt span class token operator span get update sudo apt span class token operator span get install span
  • jQuery获取标签属性值(一)

    1 box shadow属性可以设置盒子阴影的效果其参数为 xff1a box shadow h shadow v shadow blur spread color inset h shadow必需的 水平阴影的位置 允许负值v shado
  • 尚硅谷react课程-day04

    目录 1 回调形式的ref 2 回调ref中调用次数问题 3 受控组件 4 非受控组件 1 回调形式的ref 1 利用react提供的ref属性名通过回调函数的属性值去调用节点自身 currentnode 61 gt this input1
  • 尚硅谷react课程-day05

    目录 1 高阶函数 2 组件的生命周期 onChange 61 this saveFormData 39 username 39 这个代码的意思是把saveFormData函数调用后的返回值交给onChange回调 xff0c 不是把sav
  • 快捷式~node.js环境搭建

    1 安装包官网下载 xff1a Node js nodejs org 2 安装完成后修改环境变量 在上面已经完成了 node js 的安装 xff0c 即使不进行此步骤的环境变量配置也不影响node js的使用 但是 xff0c 若不进行环
  • 51单片机LCD1602液晶屏显示方法

    以显示hello world 2022 10 17 为例 首先把LCD1602的模块化程序添加到项目目录中 xff0c 模块化方法在51单片机之程序模块化 学习笔记吧的博客 CSDN博客这里可以学习 实验程序 xff1a include l
  • 深度剖析C语言符号篇

    致前行的人 xff1a 人生像攀登一座山 xff0c 而找寻出路 xff0c 却是一种学习的过程 xff0c 我们应当在这过程中 xff0c 学习稳定冷静 xff0c 学习如何从慌乱中找到生机 目录 1 注释符号 xff1a 2 续接符和转
  • HTML5(入门)

    目录 一 HTML5概念和基本的结构 二 基本标签学习 三 图像标签 四 连接标签 五 列表标签 六 表格标签 table 七 媒体标签 八 网页结构 九 内联框架 iframe 十 表单标签 form 十一 初级验证 一 HTML5概念和
  • Arduino驱动oled

    1 模块介绍 I2C显示屏 xff08 驱动为ssd1306 xff0c 分辨率为128 64 xff09 Arduino nano xff08 Atmega168p xff09 2 模块连接 参考开发板管教定义图可知SCL SDA应该连接
  • 4.3.2、分类编址的 IPv4 地址

    分类编址的 IPv4 地址分为 A B C D E 五类 A 类地址的网络号部分占 8 8 8 比特 xff0c 主机号部分占 24 24 24
  • 解决idea2020版本无法使用actiBPM插件问题

    下载 由于在idea自带的插件商店中搜索不到此插件 xff0c 所以我们需要去官网下载 xff1a 地址 xff1a JetBrains Marketplace 点击下载 xff1a 安装 下载完成之后 xff0c 打开idea的设置 xf
  • 【Ubuntu小工具安装】

    span class token number 1 span 安装谷歌中文拼音输入法 span class token number 2 span 双显示器屏幕设置 和独立显卡显示设置 span class token number 3 s
  • 图像的底层特征、高层特征是什么,语义信息是什么意思

    底层特征指的是 xff1a 轮廓 边缘 颜色 纹理和形状特征 颜色特征 是一种全局特征 描述了图像或图像区域所对应的景物的表面性质 纹理特征 也是一种全局特征 它也描述了图像或图像区域所对应景物的表面性质 形状特征 有两类表示方法 一类是轮
  • 配置与管理samba服务器(Linux)

    实验目的 1 了解samba服务器的功能 2 掌握samba服务器的配置管理 3 掌握samba 客户端程序的使用 4 掌握Windows主机和Linux主机共享文件互访的方法 准备工作 1 物理机 xff08 windows客户端 xff
  • IPV4地址详解

    文章目录 IPV4地址分类编址划分子网无分类编制CIDR路由聚合 应用规划 xff08 子网划分的细节 xff09 定长的子网掩码FLSM变长的子网掩码VLSM IPV4地址 IPV4地址就是给因特网 xff08 Internet xff0
  • 字符串拆分函数strtok实现对字符串的拆分

    前言 xff1a 在本章 xff0c 将介绍如何通过strtok函数来分隔字符串 问 xff1a 现有一段字符串 34 chatgpt 64 wenxin baidu 34 如何才能将 64 去掉打印出剩下的部分呢 xff1f 下面将先介绍