strtok() 是 C 语言中的一个字符串处理函数,属于标准库 <string.h>。它用于将字符串分割成若干个子字符串。通常用于从一个字符串中按指定的分隔符提取子字符串。

1. 函数原型

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

  • str:这是待分割的字符串。第一次调用 strtok 时,传入的是要分割的字符串。在后续的调用中,传入 NULL 作为 str,让 strtok 继续从上一次分割的位置开始分割。
  • delim:这是分隔符字符集合,定义了分割字符串时的分隔符。可以是单个字符,也可以是多个字符的集合。

2. 返回值

  • strtok() 返回指向分割后子字符串的指针。每次调用 strtok() 都会返回下一个子字符串。如果没有更多的子字符串可供返回,则返回 NULL

3. 分割过程

  • strtok() 会将输入字符串按分隔符分割成若干个子字符串。
  • 每次调用 strtok() 会在原始字符串中替换分隔符字符为 \0(空字符),然后返回当前的子字符串。
  • 第一次调用时传入的是原始字符串,之后每次调用时传入 NULLstrtok 会继续处理上次的分隔符之后的部分。

4. 示例代码

#include &lt;stdio.h>
#include &lt;string.h>

int main() {
    char str[] = "Hello,World,This,Is,C";
    const char *delim = ",";  // 分隔符是逗号

    // 第一次调用 strtok
    char *token = strtok(str, delim);

    // 循环分割字符串,直到没有更多子字符串
    while (token != NULL) {
        printf("Token: %s\n", token);
        // 获取下一个子字符串
        token = strtok(NULL, delim);
    }

    return 0;
}

5. 输出

Token: Hello
Token: World
Token: This
Token: Is
Token: C

6. 函数工作原理

  • 在上面的代码中,strtok(str, delim) 会在第一次调用时返回 "Hello",然后在原字符串中将逗号替换成 \0,分割出一个新的字符串 "Hello"。接下来再次调用 strtok(NULL, delim),它会返回下一个子字符串 "World",并继续分割,直到没有更多的子字符串为止。

7. 注意事项

  • 修改原字符串strtok() 会修改原始字符串,将分隔符替换为 \0。因此,原字符串会被破坏。如果需要保留原字符串,可以先对原始字符串做备份。
  • 不可重入strtok() 是不可重入的函数。即它在内部使用了静态变量来保存分割的位置,因此在同一个线程中不能在多次调用 strtok() 时同时操作不同的字符串。为了避免这个问题,可以使用 strtok_r(),它是一个线程安全的版本。
  • 连续空格或分隔符:如果字符串中有多个连续的分隔符,strtok() 会跳过这些分隔符,直到找到有效的子字符串。

8. 线程安全的版本:strtok_r

strtok_r() 是 strtok() 的线程安全版本,它的函数原型如下:

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

  • str:同 strtok()
  • delim:同 strtok()
  • saveptr:保存当前分割位置的指针。strtok_r 使用这个指针来在多次调用之间保持状态。

示例:使用 strtok_r 来处理多线程

#include &lt;stdio.h>
#include &lt;string.h>

int main() {
    char str[] = "apple,orange,banana,grape";
    char *token;
    char *saveptr;

    // 使用 strtok_r 进行字符串分割
    token = strtok_r(str, ",", &amp;saveptr);
    while (token != NULL) {
        printf("Token: %s\n", token);
        token = strtok_r(NULL, ",", &amp;saveptr);
    }

    return 0;
}

9. 总结

  • strtok() 是一个非常有用的函数,用于将字符串按指定的分隔符分割成子字符串。
  • 它会修改原始字符串,因此如果需要保留原始字符串,应该事先做备份。
  • strtok() 不是线程安全的,但可以使用 strtok_r() 代替,以避免线程问题。

希望这个解释能帮助你更好地理解 strtok() 函数的使用。如果有其他问题,欢迎继续提问!