C语言字符串分割:strtok、strtok_r

news/2024/11/25 14:28:39/

头文件include <string.h>

一、strtok

原型

char *strtok(char s[], const char *delim);

参数与功能

分解字符串为一组字符串。s为要分解的字符串;delim为分隔符字符串。

例如:

strtok("abc,def,ghi",",")

表示将字符串以逗号进行分割,最后可以分割成为abc def ghi,尤其在点分十进制的IP中提取应用较多。

strtok作用于字符串s,以包含在delim中的字符为分界符,将s切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。

返回值

从s开头开始的一个个被分割的串。当s中的字符查找到末尾时,返回NULL。

如果查找不到delim中的字符时,返回当前strtok的字符串的指针。

所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。

说明

strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。

应用举例

#include<stdio.h>
#include<string.h>int main(void)
{char a[1000];char aa[1000];char c[] = " ";printf("请输入一串字符:");gets(a);char *p = strtok(a,c);printf("%s\n",p);p = strtok(NULL,c);while(p){printf("%s\n",p);p = strtok(NULL,c); }
}

运行结果:

二、strtok_r

原型

char *strtok_r(char *str, const char *delim, char **saveptr);

参数与功能

str为要分解的字符串,delim为分隔符字符串。char **saveptr参数是一个指向char *的指针变量,用来在strtok_r内部保存切分时的上下文,以应对连续调用分解相同源字符串。

strtok_r()函数用于分割字符串。strtok_r是linux平台下的strtok函数的线程安全版。windows的string.h中并不包含它,windows下的对应安全函数为strtok_s。

strtok_r函数是strtok函数的可重入版本。第一次调用strtok_r时,str参数必须指向待提取的字符串,saveptr参数的值可以忽略。连续调用时,str赋值为NULL,saveptr为上次调用后返回的值,不要修改。一系列不同的字符串可能会同时连续调用strtok_r进行提取,要为不同的调用传递不同的saveptr参数。

strtok_r实际上就是将strtok内部隐式保存的this指针,以参数的形式与函数外部进行交互。由调用者进行传递、保存甚至是修改。需要调用者在连续切分相同源字符串时,除了将str参数赋值为NULL,还要传递上次切分时保存下的saveptr。

应用举例

#include <stdio.h>
#include <string.h>int main()
{char str[]="123 adw 321 dfae";char *ptr;char *p;printf("before strtok:  str=%s\n",str);printf("begin:\n");ptr = strtok_r(str, " ", &p);while(ptr != NULL){printf("str=%s\n",str);printf("ptr=%s\n",ptr);ptr = strtok_r(NULL, ",", &p);}return 0;
}

运行结果:

 

参考:

https://blog.csdn.net/yishizuofei/article/details/78232946?locationNum=5&fps=1

https://baike.baidu.com/item/strtok/5522728?fr=aladdin


http://www.ppmy.cn/news/430660.html

相关文章

clrscr()

今天在网上看了一个程序&#xff0c;里面有这个程序clrscr()&#xff0c;因为本人一直不是很喜欢turboc&#xff0c;在别的编译器下面写程序&#xff0c;怎么调试也不合适&#xff01;在百度上搜索了一下&#xff0c;原来此函数只能用在turboc&#xff0c;现在分享出来&#xf…

iScroll

一、iScroll基本使用 1.1 什么是iScroll? iScroll是一个高性能&#xff0c;资源占用少&#xff0c;无依赖&#xff0c;多平台的javascript滚动插件。iScroll不仅仅是滚动。在你的项目中包含仅仅4kb大小的iScroll&#xff0c;能让你的项目便拥有滚动&#xff0c;缩放&#xf…

C语言-字符串分割函数strtok()

最近项目开发比较忙&#xff0c;离上一次更新已经过去一个多月了&#xff0c;项目完成的差不多了&#xff0c;其中有一个黑白名单阻断的需求&#xff0c;刚开始我是用的指针偏移&#xff0c;一个字节一个字节的去匹配&#xff0c;由于业务很多&#xff0c;觉得这样写太繁琐了&a…

python实现自动打开终端并执行命令(windows)

python实现自动打开终端并执行代码&#xff08;windows&#xff09; 一、环境和代码1. 安装pypiwin322. 代码示例 二、效果展示三、存在问题1. ImportError: DLL load failed while importing win32api: 找不到指定的模块。2. 窗口打开了但是不输入命令 最近有同学需要同时打开…

scorll

关闭 微信平台 <script type"text/javascript">function closeDiv() {document.getElementById(floater).style.visibility hidden;}self.onError null;currentX currentY 0;whichIt null;lastScrollX 0; lastScrollY 0;NS (document.layers) ? 1 : 0…

scoket

我们深谙信息交流的价值&#xff0c;那网络中进程之间如何通信&#xff0c;如我们每天打开浏览器浏览网页 时&#xff0c;浏览器的进程怎么与web服务器通信的&#xff1f;当你用QQ聊天时&#xff0c;QQ进程怎么与服务器或你好友所在的QQ进程通信&#xff1f;这些都得靠socket&a…

Slick教程

Slick 编程(1): 概述Slick 编程(2): 准备开发环境Slick 编程(3): 基本查询Slick 编程(4): 数据库连接和事务处理Slick 编程(5): 数据库SchemaSlick 编程(6): 查询(一)Slick 编程(7): 查询(二)Slick 编程(8): 查询(三)Slick 编程(9): 直接使用SQL语句

Screeps

文章目录 前言一、Screeps是什么&#xff1f;二、部分介绍1.CreepsCreeps 能力移动力 2.控制全局控制等级房间控制等级 3.防御你的房间安全模式 三、链接 前言 篇幅有限&#xff0c;就不全部转载。 此文为系列文章第一篇 以下内容全部来自Screeps官网 API文档 在Steam上有售…