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
(空字符),然后返回当前的子字符串。 - 第一次调用时传入的是原始字符串,之后每次调用时传入
NULL
,strtok
会继续处理上次的分隔符之后的部分。
4. 示例代码
#include <stdio.h>
#include <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 <stdio.h>
#include <string.h>
int main() {
char str[] = "apple,orange,banana,grape";
char *token;
char *saveptr;
// 使用 strtok_r 进行字符串分割
token = strtok_r(str, ",", &saveptr);
while (token != NULL) {
printf("Token: %s\n", token);
token = strtok_r(NULL, ",", &saveptr);
}
return 0;
}
9. 总结
strtok()
是一个非常有用的函数,用于将字符串按指定的分隔符分割成子字符串。- 它会修改原始字符串,因此如果需要保留原始字符串,应该事先做备份。
strtok()
不是线程安全的,但可以使用strtok_r()
代替,以避免线程问题。
希望这个解释能帮助你更好地理解 strtok()
函数的使用。如果有其他问题,欢迎继续提问!
发表回复