一个字符串常常包含几个单独的部分,它们彼此被分隔开来。每次为了处理这些部分,你首先必须把它们从字符串中抽取出来。
这个任务有#include
函数原型如下:
char *strtok( char *str, char const *sep );
sep参数是个字符串,定义了用作分隔符的字符集合,(也就是sep字符串中的字符都作为分隔符)。第一个参数str指定一个字符串,它包含零个或多个有sep字符串中的分隔符分隔的标记,(这里的标记指的是分隔出来的一个又一个子字符串)。strtok找到str的第一个标记,并将其用NUL字节结尾,然后返回一个指向该标记的指针。
警告:
当strtok函数执行任务时,它将会修改它所处理的字符串。如果源字符串不能被修改,那就复制一份,将这份拷贝传递给strtok函数。
如果strtok函数的第一个参数不是NULL,函数将找到字符串的第一个标记。函数同时将保存它在字符串中的位置。
如果strtok函数的第一个参数是NULL,函数就在同一个字符串中从这个被保存的位置开始查找下一个标记。如果字符串内不存在更多的标记(也就是查找到了最后一个标记),strtok函数就返回一个NULL指针。
在典型情况下,向它传递一个指向字符串的指针。然后,这个函数被重复调用,直到它返回NULL为止。
先给出一个直观的例子感受下:
#include
#include
int main () {
char str[80] = "This is - www.tutorialspoint.com - website";
const char s[2] = "-";
char *token;
/* get the first token */
token = strtok(str, s);
/* walk through other tokens */
while( token != NULL ) {
printf( " %s\n", token );
token = strtok(NULL, s);
}
return(0);
}
运行的结果为:
这个例子的地址:https://www.tutorialspoint.com/compile_c_online.php
不解释了,很简单。
突然发现《C与指针》的例子不错,这个例子是从字符数组中提取空白字符分隔的标记并把它们打印出来:
void print_tokens(char *line)
{
static char whitespace[] = "\t\f\r\v\n";
char *token;
for( token = strtok( line, whitespace );
token != NULL;
token = strtok( NULL, whitespace )
)
printf("Next token is %s\n", token );
}
关于这个函数的功能,我们可以测试一下:
#include
#include
int main () {
char str[80] = "This is www.tutorialspoint.com website";
//函数原型
void print_tokens(char *line);
//函数调用
print_tokens( str );
return(0);
}
void print_tokens(char *line)
{
static char whitespace[] = "\t\f\r\v\n";
char *token;
for( token = strtok( line, whitespace );
token != NULL;
token = strtok( NULL, whitespace )
)
printf("Next token is %s\n", token );
}
暂时放这,功能和我预想的有点出入!暂未找到原因!
执行上个程序,结果是:
这并不是我所想的结果,上面的结果相当于没有分隔出来,到底是什么原因呢?
原来那个分隔字符串whitespace在初始化的时候除了问题,初始化中没有把空白字符包括进去,改正如下:
static char whitespace[] = " \t\f\r\v\n";
如此以来,结果就符合预想了:
就这样吧,最后推荐一波:
《C 与 指针》
https://baike.baidu.com/item/strtok
https://www.tutorialspoint.com/c_standard_library/c_function_strtok.htm
https://blog.csdn.net/ituling/article/details/52381583