strtok
是 C 语言标准库中的一个函数,用于将字符串分割成一系列标记(tokens)。这个函数声明在 <string.h>
头文件中。
函数原型
char *strtok(char *str, const char *delim);
参数
str
:要分割的字符串。首次调用时传入需要分割的字符串,后续调用时传入NULL
。delim
:一个字符串,包含所有分割符(delimiters)。strtok
会在遇到这些字符时将字符串分割。
返回值
- 返回指向被分割字符串中第一个标记的指针。
- 如果没有更多的标记,返回
NULL
。
工作原理
- 首次调用:传入需要分割的字符串,
strtok
会找到第一个标记并将其返回,同时将字符串的当前位置保存在内部静态变量中。 - 后续调用:传入
NULL
作为字符串,strtok
会继续从上次分割的位置开始,找到下一个标记并将其返回。
使用示例
下面是一个使用 strtok
函数的示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, world! Welcome to C programming.";
const char delim[] = " ,.!";
// 获取第一个标记
char *token = strtok(str, delim);
// 继续获取后续标记
while (token != NULL) {
printf("Token: %s\n", token);
token = strtok(NULL, delim);
}
return 0;
}
解释
-
初始化字符串和分隔符:
char str[] = "Hello, world! Welcome to C programming."; const char delim[] = " ,.!"; // 分隔符包括空格、逗号、点和感叹号
-
获取第一个标记:
char *token = strtok(str, delim);
- 这里
str
是要分割的字符串,delim
是分隔符字符串。 - 返回值
token
是第一个标记(在这个例子中是 “Hello”)。
- 这里
-
循环获取后续标记:
while (token != NULL) { printf("Token: %s\n", token); token = strtok(NULL, delim); }
- 在循环中,
strtok(NULL, delim)
继续从上次分割的位置开始获取下一个标记,直到没有更多的标记返回NULL
。
- 在循环中,
注意事项
-
修改原字符串:
strtok
会修改传入的字符串,在分隔符位置插入空字符 (\0
) 来分割标记。因此,传入的字符串必须是可修改的数组,而不能是字符串常量。 -
不可重入:由于
strtok
使用静态变量存储当前位置,因此在多线程环境下或在同一个函数中嵌套调用strtok
会出现问题。C11 标准引入了strtok_r
,它是一个线程安全的版本。
线程安全的 strtok_r
strtok_r
的函数原型如下:
char *strtok_r(char *str, const char *delim, char **saveptr);
使用 strtok_r
可以避免静态变量的问题,因为它将当前位置保存在 saveptr
指针中:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, world! Welcome to C programming.";
const char delim[] = " ,.!";
char *saveptr;
// 获取第一个标记
char *token = strtok_r(str, delim, &saveptr);
// 继续获取后续标记
while (token != NULL) {
printf("Token: %s\n", token);
token = strtok_r(NULL, delim, &saveptr);
}
return 0;
}
总结
strtok
函数是一个强大的工具,用于将字符串分割成标记。了解其工作原理和注意事项,可以帮助你在编写 C 语言代码时有效地使用它。如果需要线程安全的操作,请使用 strtok_r
。