C语言字符串分割函数strtok_r

strtok_r 是 C 语言标准库 <string.h> 中提供的一个线程安全的字符串分割函数。它是 strtok 函数的重入(reentrant)版本。
为什么需要 strtok_r
传统的 strtok 函数使用一个静态内部变量来保存当前解析到的位置。这意味着如果你在一个函数中开始解析一个字符串,然后调用另一个函数,而那个函数也调用了 strtok 来解析另一个字符串,那么第一个解析过程的状态就会被破坏。在多线程环境中,这会导致严重的数据竞争和不可预测的行为。
strtok_r 通过要求调用者传递并管理一个额外的指针参数(称为“保存指针” saveptr),从而避免了使用静态内部变量,实现了线程安全。
函数原型
strtok_r 的函数原型如下:
#include <string.h>

char *strtok_r(char *str, const char *delim, char **saveptr);
参数说明
  • str
    • 第一次调用时:指向要解析的原始字符串的指针。
    • 后续调用时:必须传递 NULL,表示继续解析上一次留下的字符串。
  • delim:包含一个或多个分隔符字符的字符串。
  • saveptr:这是一个指向 char * 的指针(即 char **)。这是 strtok_r 实现线程安全的关键。调用者必须声明一个 char * 变量,并将它的地址传递给 strtok_rstrtok_r 使用这个指针在内部跟踪解析进度。
返回值
  • 成功时:返回下一个令牌(token)的指针。
  • 没有更多令牌时:返回 NULL

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    // 原始字符串,需要是可修改的(不能是字符串字面量)
    char str[] = "apple,banana,orange,grape"; 
    const char delim[] = ",";

    char *token;
    char *saveptr; // 用于保存内部状态的指针

    printf("Parsing string: \"%s\"\n", str);

    // 第一次调用:传入原始字符串地址
    token = strtok_r(str, delim, &saveptr);
    while (token != NULL) {
        printf("Token: %s\n", token);

        // 后续调用:传入 NULL 作为第一个参数,继续使用 saveptr 跟踪进度
        token = strtok_r(NULL, delim, &saveptr);
    }

    return 0;
}

 

posted @ 2025-11-20 09:16  PKICA  阅读(17)  评论(0)    收藏  举报