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