strtok函数源码:strtok函数源码解析
strtok函数的基本功能
strtok函数用于将一个字符串根据指定的分隔符进行分割,每次调用返回分割后的子字符串,其函数原型如下:
char *strtok(char *str, const char *delimiters);
- str:指向要被分割的字符串。
- delimiters:包含所有分隔符的字符串。
函数会修改原始字符串,将分隔符替换为NULL('\0'),并将分割后的子字符串的起始地址返回。

strtok函数的典型使用示例
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello world c language";
const char delimiters[] = " ";
char *token;
printf("Splitting the string: \"%s\" into tokens using delimiters \"%s\"...\n", str, delimiters);
token = strtok(str, delimiters);
while (token != NULL) {
printf("Token: \"%s\"\n", token);
token = strtok(NULL, delimiters);
}
return 0;
} 运行结果:
Splitting the string: "hello world c language" into tokens using delimiters " "...
Token: "hello"
Token: "world"
Token: "c"
Token: "language" strtok函数的源码分析
以下是strtok函数的典型实现(基于ANSI C标准):

#include <string.h>
char *strtok(char *str, const char *delimiters) {
static char *context = NULL;
char *start = str;
if (str == NULL) {
str = context;
}
if (str == NULL) {
return NULL;
}
while (*str != '\0') {
if (*str == *delimiters) {
*str = '\0';
start = ++str;
} else if (*delimiters == '\0') {
return start;
} else {
str++;
}
}
return start;
} 源码解析:
- 静态变量context:用于保存上一次分割结束的位置,以便下一次调用继续处理。
- 第一次调用:传入非NULL的字符串,初始化context。
- 分隔符匹配:遍历字符串,遇到分隔符时将其替换为NULL,并更新start指针。
- 空指针处理:当str指向NULL时,返回当前分割的子字符串。
strtok函数的线程安全性问题
strtok函数使用静态变量context,这意味着它不是线程安全的,在多线程环境下,多个线程同时调用strtok可能导致数据混乱。
解决方案:
使用strtok_r函数(POSIX标准),它允许指定一个外部缓冲区来保存上下文,从而避免线程安全问题。
#include <string.h> char *strtok_r(char *str, const char *delimiters, char **context);
示例:
char str[] = "hello world c language";
const char delimiters[] = " ";
char *token;
char *context;
token = strtok_r(str, delimiters, &context);
while (token != NULL) {
printf("Token: \"%s\"\n", token);
token = strtok_r(NULL, delimiters, &context);
} strtok函数是C语言中处理字符串分割的强大工具,其源码实现依赖于静态变量来保存上下文,使得函数调用可以连续进行,这种设计也带来了线程安全问题,在实际开发中,应根据需求选择合适的函数版本,确保程序的正确性和安全性。
通过本文的分析,读者可以深入理解strtok函数的工作原理,并在实际项目中灵活运用。

相关文章:
文章已关闭评论!










