strtok的函数原型为char *strtok(char *s, char *delim),功能为“Parse S into tokens separated by characters in DELIM.If S is NULL, the saved pointer in SAVE_PTR is used as the next starting point. ” 翻译成汉语就是:作用于字符串s,以包含在delim中的字符为分界符,将s切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。
函数的返回值为从指向被分割的子串的指针。
要点纪要:
1.函数的作用是分解字符串,所谓分解,即没有生成新串,只是在str所指向的内容上做了些手脚而已。因此,源字符串str发生了变化!
下面就以str[] = "ab,c,d"为简单案例一代吗来证实其str发生了变化:
#include <string.h>#include <stdio.h>
int main(void)
{
char str[] = "ab,c,d";
char *p = NULL;
char delim = ",";
int in = 0;
p = strtok(str, delim);
while(p != NULL){
printf("the character is :%s\n",p);
printf("the str is : %s\n",str);
p = strtok(NULL,delim);
}
}
结果:
the character is : ab
the str is : ab
the character is : c
the str is : ab
the character is : d
the str is : ab
有上面的结果可知,str发生了变化。此时打印str的值,只会显示“ab”,而后面" ,c,d”不翼而飞了。实际上,strtok函数根据delim中的分界符,找到其首次出现的位置,即ab后面那个空格(str[2]),将其修改成了'\0’。其余位置不变。这就很好解释为什么打印str的值只能出现“ab”,而非str中的全部内容了。因此,使用strtok时一定要慎重,以防止源字符串被修改。
理解了str的变化,就很好解释函数的返回值了。返回值delim为分界符之前的子串;由变量的地址可知,p依然指向源字符串。