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_r。strtok_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; }
浙公网安备 33010602011771号