返回

strtok函数源码:strtok函数源码解析

来源:网络   作者:   日期:2025-10-24 16:11:27  

strtok函数的基本功能

strtok函数用于将一个字符串根据指定的分隔符进行分割,每次调用返回分割后的子字符串,其函数原型如下:

char *strtok(char *str, const char *delimiters);
  • str:指向要被分割的字符串。
  • delimiters:包含所有分隔符的字符串。

函数会修改原始字符串,将分隔符替换为NULL('\0'),并将分割后的子字符串的起始地址返回。

strtok函数源码:strtok函数源码解析


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标准):

strtok函数源码:strtok函数源码解析

#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;
}

源码解析:

  1. 静态变量context:用于保存上一次分割结束的位置,以便下一次调用继续处理。
  2. 第一次调用:传入非NULL的字符串,初始化context。
  3. 分隔符匹配:遍历字符串,遇到分隔符时将其替换为NULL,并更新start指针。
  4. 空指针处理:当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函数的工作原理,并在实际项目中灵活运用。

strtok函数源码:strtok函数源码解析

分类:编程
责任编辑:今题网
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。

相关文章:

文章已关闭评论!