strtok函数用于将字符串分割成一个个的标记,以指定分隔符为界限。
strtok函数用法介绍
strtok 是一个在C语言中用来分割字符串的函数,它属于C标准库中的<string.h>头文件。strtok 能够将一个字符串根据指定的分隔符集分割成多个子字符串(称为“token”),这些子字符串可以通过连续调用 strtok 来依次获取。
基本语法
char *strtok(char *str, const char *delim);
这里:
str 是要分割的字符串。
delim 是分隔符集合,可以包含一个或多个字符。
工作原理
strtok 函数使用一种内部静态指针来追踪字符串中当前的位置,在首次调用时,它将这个指针设置为输入字符串 str 的起始位置,在后续调用时,strtok 会从上次结束的位置继续扫描字符串。
每次调用 strtok 时,它会从上一次停止的地方开始查找下一个分隔符集中的一个字符,如果找到了,它就将该字符前面的部分作为一个 token 返回,并且在这个分隔符之后截断字符串,如果没有找到分隔符,则返回指向字符串剩余部分的指针。
注意事项
1、strtok 是不可重入的,因为它使用了一个静态内部指针来记录位置,在同一线程中连续调用 strtok 是安全的,但如果你尝试在多个线程中同时使用同一个字符串调用 strtok,结果将是不确定的。
2、一旦字符串被 strtok 分割后,原始字符串将被修改,因为 strtok 直接在原字符串上进行操作。
3、strtok 不会分配新内存来存储分割得到的子字符串,返回的都是原始字符串中的地址。
4、str 参数为 NULL,strtok 将返回 NULL,这可以用来检查是否已经处理完所有 tokens。
示例代码
下面是使用 strtok 的一个简单例子:
include <stdio.h>
include <string.h>
int main() {
char str[] = “Hello, World! How are you?”;
char delim[] = ” ,!”;
char *token = strtok(str, delim);
while (token != NULL) {
printf(“%s
“, token);
token = strtok(NULL, delim);
}
return 0;
}
这段代码首先定义了一个待分割的字符串 str 和一个包含分隔符的字符串 delim,然后通过循环调用 strtok 来逐个获取并打印出每个 token。
问题与解答
Q1: 能否在同一个程序中多次使用 strtok 函数?
A1: 可以,但是每次使用 strtok 都应该提供一个新的字符串作为第一个参数,以避免干扰内部静态指针。
Q2: 如何避免 strtok 修改原始字符串?
A2: 在调用 strtok 之前,可以先复制一份原始字符串,然后在副本上进行操作。
Q3: 为什么 strtok 被认为是线程不安全的?
A3: 因为 strtok 使用了静态变量来跟踪字符串中的位置,如果多个线程同时使用 strtok 可能会互相干扰。
Q4: 如果我需要在一个函数里多次分割不同的字符串,应该如何做?
A4: 你可以使用 strtok_r 或者 strtok_s,这两个函数接受一个额外的指针参数,用于非静态地保存字符串的位置,从而使得它们可重入。