C 库函数 - strtok()
strtok() 是 C 标准库中的一个字符串处理函数,用于将字符串分割成一系列子字符串(即"标记"或"token")。
C 库函数 char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串,delim 为分隔符。
声明
下面是 strtok() 函数的声明。
char *strtok(char *str, const char *delim)
参数
str: 要分割的字符串。在第一次调用时,传入要分割的字符串;后续调用时,传入
NULL
,表示继续分割同一个字符串。delim: 分隔符字符串。
strtok()
会根据这个字符串中的任意一个字符来分割str
。
返回值
返回指向下一个标记的指针。如果没有更多的标记,则返回 NULL。
实例
下面的实例演示了 strtok() 函数的用法。
实例
#include <string.h>
#include <stdio.h>
int main () {
char str[80] = "This is - www.248k.com - website";
const char s[2] = "-";
char *token;
/* 获取第一个子字符串 */
token = strtok(str, s);
/* 继续获取其他的子字符串 */
while( token != NULL ) {
printf( "%s\n", token );
token = strtok(NULL, s);
}
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:
This is www.248k.com website
注意事项
修改原字符串:
strtok()
会修改传入的字符串,将分隔符替换为\0
(空字符)。因此,原始字符串会被破坏。不可重入:
strtok()
使用静态缓冲区来保存状态,因此它不是线程安全的。如果在多线程环境中使用,可以考虑使用strtok_r()
(可重入版本)。连续分隔符: 如果字符串中有连续的分隔符,
strtok()
会忽略它们,并返回下一个有效的标记。
可重入版本:strtok_r()
strtok_r() 是 strtok() 的可重入版本,它允许你在多线程环境中安全地使用。它的原型如下:
char *strtok_r(char *str, const char *delim, char **saveptr);
saveptr: 是一个指向 char* 的指针,用于保存分割的状态。
实例
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "This is a sample string";
char *token;
char *saveptr;
// 第一次调用 strtok_r,传入要分割的字符串
token = strtok_r(str, " ", &saveptr);
// 继续调用 strtok_r,直到返回 NULL
while (token != NULL) {
printf("%s\n", token);
token = strtok_r(NULL, " ", &saveptr);
}
return 0;
#include <string.h>
int main() {
char str[] = "This is a sample string";
char *token;
char *saveptr;
// 第一次调用 strtok_r,传入要分割的字符串
token = strtok_r(str, " ", &saveptr);
// 继续调用 strtok_r,直到返回 NULL
while (token != NULL) {
printf("%s\n", token);
token = strtok_r(NULL, " ", &saveptr);
}
return 0;
strtok() 是一个方便的字符串分割函数,但需要注意它的副作用(修改原字符串)和不可重入性。在多线程环境中,建议使用 strtok_r() 来避免竞争条件。
xhrrj.com
345***[email protected]
特别要注意分割处理后原字符串 str 会变,变成第一个子字符串:
输出:
xhrrj.com
345***[email protected]
一u一风荷举
wan***[email protected]
注意,上面那篇笔记不完全对,原字符串的改动是切分符原位置均更改为 '\0',所以内容都还在,可以通过逐个字符打印检验。
输出:
一u一风荷举
wan***[email protected]