C语言:strtok函数小结

来源:互联网 发布:上汽大众 知乎 编辑:程序博客网 时间:2024/05/23 17:08

C语言:strtok函数小结

        前几天第一次用strtok函数来分割字符串,看了一些该函数的示例,有一些困惑。为什么第一次传入的数组名,第二次传入NULL。经过摸索后,终于明白strtok函数是怎么个用法了。

       个人觉得,主要原因是strtok函数的源码中使用了static变量。本人找不到源码,于是自己写一个功能相同的函数,代码如下:

char *mystrtok( char *input,const char *str){
 static char *move=NULL;
 char *save_input;
 int i,j,len;
 if(input!=NULL)
  move=input;
 if(*move=='\0')
  save_input=NULL;
 else save_input=move;
 len=strlen(str);
 while(*move!='\0'){
  for(i=0;i<len;i++){
   if(str[i]==*move){
    *move='\0';
    move++;
    return save_input;
   }
  }
  move++;
 }
 return save_input;
}

 顺带一提,strtok函数中的第二个参数是为分隔符字符串,该字符串中的所有字符(除了'\0'外)都将成为分隔符,并用'\0'来替换。举个例子:

strtok(input, "bd");中的第二个参数是"bd",则”bd"中的'b'、'd’都成为分隔符,当字符数组input中遇到'b'或者'd'时,就用'\0'来替换。该函数用一次,替换一次。

strtok函数的实现方式大致如下:

(1)当第一个参数不为NULL时,从输入的字符串的首地址开始查找分隔符,找到分隔符,替换成'\0',然后移动下一个字符,作为下一次的起始查找位置,最后返回本次查找的起始查找地址,因为第一次是从字符串的首地址开始,故第一次返回该字符串的首地址,如果第一次查找便找不到分隔符,则查找会停在字符串末尾的'\0'处,然后返回字符串的首地址。

(2)若第一个参数为NULL,则从上一次查找后停在的位置开始,继续查找,查找方式和(1)相同。所以,第一次用strtok函数时第一个参数不能为NULL,否则会由于内存不可读而报错。

(3)若某一次(除去第1次)查找开始时,第一个字符便是'\0',则返回NULL。

0 0