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() 函数的使用。如果有其他问题,欢迎继续提问!
发表回复