C 库函数 - strtok()

C 标准库 - <string.h> C 标准库 - <string.h>

strtok() 是 C 标准库中的一个字符串处理函数,用于将字符串分割成一系列子字符串(即"标记"或"token")。

C 库函数 char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串,delim 为分隔符。

声明

下面是 strtok() 函数的声明。

char *strtok(char *str, const char *delim)

参数

  • str: 要分割的字符串。在第一次调用时,传入要分割的字符串;后续调用时,传入 NULL,表示继续分割同一个字符串。

  • delim: 分隔符字符串。strtok() 会根据这个字符串中的任意一个字符来分割 str

返回值

返回指向下一个标记的指针。如果没有更多的标记,则返回 NULL。

实例

下面的实例演示了 strtok() 函数的用法。

实例

#include <string.h> #include <stdio.h> int main () { char str[80] = "This is - www.248k.com - website"; const char s[2] = "-"; char *token; /* 获取第一个子字符串 */ token = strtok(str, s); /* 继续获取其他的子字符串 */ while( token != NULL ) { printf( "%s\n", token ); token = strtok(NULL, s); } return(0); }

让我们编译并运行上面的程序,这将产生以下结果:

This is 
 www.248k.com 
 website

注意事项

  1. 修改原字符串: strtok() 会修改传入的字符串,将分隔符替换为 \0(空字符)。因此,原始字符串会被破坏。

  2. 不可重入: strtok() 使用静态缓冲区来保存状态,因此它不是线程安全的。如果在多线程环境中使用,可以考虑使用 strtok_r()(可重入版本)。

  3. 连续分隔符: 如果字符串中有连续的分隔符,strtok() 会忽略它们,并返回下一个有效的标记。


可重入版本:strtok_r()

strtok_r() 是 strtok() 的可重入版本,它允许你在多线程环境中安全地使用。它的原型如下:

char *strtok_r(char *str, const char *delim, char **saveptr);

saveptr: 是一个指向 char* 的指针,用于保存分割的状态。

实例

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

int main() {
    char str[] = "This is a sample string";
    char *token;
    char *saveptr;

    // 第一次调用 strtok_r,传入要分割的字符串
    token = strtok_r(str, " ", &saveptr);

    // 继续调用 strtok_r,直到返回 NULL
    while (token != NULL) {
        printf("%s\n", token);
        token = strtok_r(NULL, " ", &saveptr);
    }

    return 0;
}

strtok() 是一个方便的字符串分割函数,但需要注意它的副作用(修改原字符串)和不可重入性。在多线程环境中,建议使用 strtok_r() 来避免竞争条件。

C 标准库 - <string.h> C 标准库 - <string.h>