函数strtok
原型 char * strtok ( char * str, const char * delimiters );
功 能: 查找由在第二个串中指定的分界符分隔开的单词, 即源串中除去了含有分隔串中的所有字符后余下的一段段的字符串,每调用一次找到一串,找不到则返回空串。显然函数会改变参数,因此不能用于常量如英文所描述。另外只能单线程安全。strtok使用注意事项:
* These functions modify their first argument.
* These functions cannot be used on constant strings.
* The identity of the delimiting character is lost.
* The strtok() function uses a static buffer while parsing, so it's not thread safe.
#include <stdio.h>
#include <string.h>
int main(){
char *str= "A stringtof ,,tokensnand some more tokens";
char str2[100];
char *seps = " ,\t\n";
char *token;
int len,i;
strcpy(str2,str);
len=strlen(str);
token = strtok(str2,seps);
while( token != NULL )
{
printf("%s ", token);
token = strtok(NULL, seps);
}
printf("\n");
printf("%s\n",str);
for(i=0;i<len;i++)
if(str2[i]=='\0')//用特殊颜色打印出'\0'字符
printf("\033[0;30;41m.\033[0m");
else
printf("%c",str2[i]);
printf("\n");
}
输出如下:
A stringtof tokensnand some more tokens
A stringtof ,,tokensnand some more tokens
A.stringtof.,,tokensnand.some.more.tokens (结束符,用特殊符号 . 表示)
上图中第一行是利用strtok进行分隔得到的多个字符串,第2行是原始的字符串str,第3行是用strtok处理后原始字符串str2。
知识点:
strtok是对原始的字符串进行修改的,是将其中的分隔字符替换为'\0',这样每次调用strtok之后返回值指向当前找到的新字符串的头,而且从这个头开始,所遇到的第一个分隔符已经替换为'\0',所以打印token可以得到分隔后的字符串,并且由于这个函数使用了静态变量所以可以利用循环不断的进行操作。
这样,既然我们明白了strtok是要对原始的字符串进行修改,就应该注意到了,其参数不能是类似:
char *str= "A stringtof , ,tokensnand some more tokens"; 这样的常量字符串,因为这种是静态存储的,是不允许修改的,而只能是字符数组形式的:
char str2[]= "A stringtof , ,tokensnand some more tokens";