首页 > 其他分享 >字符串分割: strtok和strtok_s函数使用说明

字符串分割: strtok和strtok_s函数使用说明

时间:2022-11-29 10:59:17浏览次数:47  
标签:分割 调用 记号 strtok char token str 字符串

strtok和strtok_s函数使用说明

火锅冰阔乐

已于 2022-11-05 15:13:58 修改

53
收藏
分类专栏: C++ C 文章标签: c++
版权

C++
同时被 2 个专栏收录
4 篇文章0 订阅
订阅专栏

C
1 篇文章0 订阅
订阅专栏
看了很多高赞CSDN文章和百度百科,越看越晕,浪费好多时间,特此记录
先介绍strtok,后边给个strtok_s的例子

注意:这两个函数必要连续调用多次才能实现分割和输出功能,一般和while循环配合,初始调用和后续调用有些区别,把握这一点就ok了

01 定义
定义于头文件 cstring
函数原型
char* strtok( char* str, const char* delim );

02 调用说明
寻找 str 所指向的空终止字节字符串中的下个记号。由 delim 所指向的空终止字节字符串鉴别分隔字符。

此函数被设计为调用多次,以从同一字符串获得相继的记号。

若 str 不是空指针,则调用被当做 strtok 对此特定字符串的首次调用。函数搜索首个不含于 delim 的字符。
若找不到这种字符,则 str 中完全没有记号,而函数返回空指针。
若找到这种字符,则它是记号的起始。然后函数从 delim 所含的首个字符的该点搜索。
若找不到这种字符,则 str 只有一个记号,而将来对 strtok 的调用将返回空指针
若找到这种字符,则用空字符 ‘\0’ 替换它,并将指向下个字符的指针存储于静态位置,以为后继调用所用。
然后函数返回指向记号起始的指针

若 str 为空指针,则将调用当做对 strtok 的后继调用,函数从先前调用中它剩下的位置开始。行为如同将先前存储的指针作为 str 传递。

03 参数
str - 指向要记号化的空终止字节字符串的指针
delim - 指向标识分隔符的空终止字节字符串的指针

04 返回值
指向下个记号起始的指针,或若无更多记号则为空指针。

05 注解
此函数是破坏性的:它写入 ‘\0’ 字符于字符串 str 的元素。特别是,字符串字面量不能用作 strtok 的首参数。

每次对 strtok 的调用都会修改静态对象:它不是线程安全的。

不同于大多数其他记号化器, strtok 中的分隔符能对于后继记号不同,而且甚至能依赖于先前记号的内容。

06 代码示例
#include <cstring>
#include <iostream>

int main()
{
char input[100] = "A bird came down the walk";
char *token = std::strtok(input, " ");
while (token != NULL) {
std::cout << token << '\n';
token = std::strtok(NULL, " ");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
08 拓展strtok_s
函数原型
char *strtok_s(char * str, const char * delim, char **ptr);
说明
strtok_s是strtok线程安全版本,使用方法大同小异,多了一个存放剩余字符的地址参数,说白了就是分割完剩下的找个地址存好,方便下一次用

void test() {

char str[] = "ab,cd,ef";


cout << "原始字符串为:" << str << endl;

char* token;
char* next_token;

token = strtok_s(str, ",", &next_token); //初始调用

while (token != NULL) { // 后续找不到返回Null就退出

printf("分割子字符串%s\n", token);
printf("剩余字符串=%s\n", next_token);

token = strtok_s(NULL, ",", &next_token); // 后续调用
}


}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
07 参考链接
https://www.apiref.com/cpp-zh/cpp/string/byte/strtok.html
https://www.apiref.com/cpp-zh/c/string/byte/strtok.html
Ps:这个网站也是一个很好的函数文档网站
————————————————
版权声明:本文为CSDN博主「火锅冰阔乐」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42287144/article/details/127703574

标签:分割,调用,记号,strtok,char,token,str,字符串
From: https://www.cnblogs.com/zxdplay/p/16934746.html

相关文章

  • C++如何做字符串分割(5种方法)
    C++如何做字符串分割(5种方法)卧_听风雨于 2021-04-0617:54:50 发布55916 收藏 163分类专栏: C++ 文章标签: C++ 字符串分割版权C++专栏收录该内......
  • 【字符串】最小表示法
    目录​​一、概念​​​​二、模板​​​​三、例题​​​​题:899.有序队列​​​​解:​​一、概念最小表示法是用于解决字符串最小表示问题的方法。循环同构:当字符串S中......
  • 【小航的算法日记】字符串算法(二) - 字符串比较
    目录​​一、概念​​​​二、模板​​​​三、例题​​​​题:剑指Offer05.替换空格​​​​解:​​​​题:面试题10.05.稀疏数组搜索​​​​解:​​​​题:1763.最长的......
  • 【小航的算法日记】字符串
    目录​​一、概念​​​​二、模板​​​​三、例题​​​​题:344.反转字符串​​​​解:​​​​题:541.反转字符串II​​​​解:​​​​题:剑指Offer05.替换空格​​​......
  • 1758. 生成交替二进制字符串的最少操作数
    1758.生成交替二进制字符串的最少操作数classSolution{publicintminOperations(Strings){char[]c=s.toCharArray();intn=c.length;......
  • 0121-Go-字符串格式化
    环境Time2022-08-25Go1.19前言说明参考:https://gobyexample.com/string-formatting目标使用Go语言的字符串格式化。示例packagemainimport("fmt"......
  • 0120-Go-字符串函数
    环境Time2022-08-25Go1.19前言说明参考:https://gobyexample.com/string-functions目标使用Go语言的字符串函数。示例packagemainimport("fmt"......
  • 0122-Go-模板字符串
    环境Time2022-08-25Go1.19前言说明参考:https://gobyexample.com/text-templates目标使用Go语言的模板字符串。示例packagemainimport("os""t......
  • json字符串转json对象三种方式
    //1,js自带的eval函数,其中需要添加小括号eval('('+str+')');functionstrToJson(str){varjson=eval('('+str+')');returnjson;}//2,newFunction形式fun......
  • PYTHON 字符串
    1.1字符串字符串类型是:str,是有顺序的字符序列,索引从0开始。1.2字符串的表示方法1.2.1普通字符串用单引号或双引号括起来的字符序列a="hello"b='hello'1.2.......