C语言 strtok_r 函数 是C标准库(<string.h>)中用于字符串分割的函数,属于 strtok 的线程安全版本("r"表示可重入)。它通过维护外部指针来记录分割位置,避免静态缓冲区导致的线程竞争问题。
char *strtok_r(char *str, const char *delim, char **saveptr);
str:待分割的字符串。首次调用时传入原始字符串,后续调用传入NULL(继续上次分割位置)。
delim:分隔符集合(如 "," 或 " \t\n")。多个字符中的任意一个均被视为分隔符。
saveptr:用户提供的指针,用于记录分割的上下文状态(线程安全的关键)。
成功:返回指向当前子字符串(token)的指针。
结束:当无更多子字符串时返回NULL。
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello,online,compiler";
char *saveptr;
char *token = strtok_r(str, ",", &saveptr);
while (token != NULL) {
printf("Token: %s\n", token);
token = strtok_r(NULL, ",", &saveptr);
}
return 0;
}
输出结果Token: hello
Token: online
Token: compiler
注意事项
修改原字符串:strtok_r 会直接修改输入字符串,将分隔符替换为'\0'。若需保留原字符串,应先拷贝。
线程安全:与 strtok 不同,strtok_r 通过 saveptr 参数保存状态,可在多线程中使用。
连续分隔符:多个相邻分隔符会被视为单个分隔符(不会返回空字符串)。