
strtok(), strtok_s() 字符串分割函数
发布日期:2021-05-08 09:38:25
浏览次数:24
分类:精选文章
本文共 1127 字,大约阅读时间需要 3 分钟。
strtok() 和 strtok_s() 功能说明
strtok() 功能说明
strtok() 是 C 标准库中用于字符串分割的函数,用于按给定分隔符将一个字符串分割成多个部分。该函数的核心逻辑如下:
- 在第一次调用时,参数
_Str
必须赋值为一个非空字符串,之后的调用则将_Str
设为NULL
。 - 每次调用成功返回分割后的字符串指针,失败则返回
NULL
。 - strtok() 会修改原字符串
_Str
,将分割点替换为\0
,这意味着原始字符串会被破坏。
示例代码
// 将字符串 "ab,cde,fghi" 按 "," 分割char str[] = "ab,cde,fghi";char *p[4];p[0] = strtok(str, ",");int i = 0;while (p[i] != NULL) { i++; p[i] = strtok(NULL, ",");}p[i] = "\0";for (int j = 0; j < 4; j++) { printf("%s\n", p[j]);}
strtok_s() 功能说明
strtok_s() 是 strtok() 的安全版本,改进后的主要点:
- 同样按分隔符分割字符串,但不会修改原始字符串。
- 结果会存储在
_Context
变量中,而不是静态缓冲区。 - 适用于多线程环境,避免了线程不安全的问题。
示例代码
// 将字符串 "hello world,my name is congcong." 按 "," 分割char str[] = "hello world,my name is congcong.";char *p[3];char *buf;p[0] = strtok_s(str, ",", &buf);int i = 0;while (p[i] != NULL) { i++; p[i] = strtok_s(NULL, ",");}p[i] = "\0";for (int j = 0; j < 3; j++) { printf("%s\n", p[j]);}
功能对比
功能特性 | strtok() | strtok_s() |
---|---|---|
字符串修改性 | 修改原始字符串 | 不修改原始字符串 |
内存管理 | 使用静态缓冲区 | 使用动态分配的上下文 |
线程安全性 | 线程不安全 | 线程安全 |
上下文传递 | 不支持连续分割同一字符串 | 支持连续分割同一字符串 |
注意事项
- 两种函数都修改字符串的内容,使用前需确保
_Str
非空。 - strtok() 适合一次性分割需求,而 strtok_s() 则更适合多次分割同一字符串。
- 由于内存管理的差异,建议根据具体需求选择合适的函数。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月13日 10时28分26秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
网站故障公告1:使用阿里云RDS之后一个让人欲哭无泪的下午
2019-03-06
上周热点回顾(12.31-1.6)
2019-03-06
上周热点回顾(1.21-1.27)
2019-03-06
上周热点回顾(6.3-6.9)
2019-03-06
上周热点回顾(8.12-8.18)
2019-03-06
【故障公告】升级阿里云 RDS SQL Server 实例故障经过
2019-03-06
蹒跚来迟:新版博客后台上线公测
2019-03-06
上周热点回顾(9.16-9.22)
2019-03-06
上周热点回顾(11.4-11.10)
2019-03-06
[网站公告]11月26日00:00-04:00阿里云RDS升级
2019-03-06
[网站公告]又拍云API故障造成图片无法上传(已恢复)
2019-03-06
上周热点回顾(12.16-12.22)
2019-03-06
云计算之路-阿里云上:对“黑色30秒”问题的猜想
2019-03-06
云计算之路-阿里云上:“黑色30秒”走了,“黑色1秒”来了,真相也许大白了
2019-03-06
云计算之路-阿里云上:奇怪的CPU 100%问题
2019-03-06
云计算之路-阿里云上:2014年6月12日12点IIS请求到达量突降
2019-03-06
上周热点回顾(6.9-6.15)
2019-03-06
上周热点回顾(6.16-6.22)
2019-03-06
上周热点回顾(6.23-6.29)
2019-03-06
上周热点回顾(10.20-10.26)
2019-03-06