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() 则更适合多次分割同一字符串。
  • 由于内存管理的差异,建议根据具体需求选择合适的函数。
上一篇:c++ 如何给 “运行中“ 的线程传递数据;
下一篇:2021-02-25

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月13日 10时28分26秒