strtok 和strtok_r 函数使用

只愿长相守 提交于 2019-11-29 13:37:31

strtok这个函数我们再熟悉不过了,因为我们要经常要和字符打交道,不可避免的要分割字符串连接字符串。那么我今天看一下分割字符串。

strtok

函数原型char* strtok(char *str,const char *delimiters);

来分析一下这个分割字符串函数,这个函数是在传入的字符数组里进行调整,它并没有生成新的字符数组。
第一个参数可以是字符数组或者NULL,第一次切割传要切割的字符,第二次要在原来字符数组上继续切割就传NULL;

第二个参数传入的是切割符,这个参数看起来简单其实是比第一个还复杂,它传入的是一个字符串,而不是一个字符。
我们知道切割符是一个字符这个很好理解,但是传入一个字符串那函数是怎么进行切割的呢?


my_strtok函数的实现

#include <stdio.h>
#include <string.h>

char *my_strtok(char *buff, char* delimit)
{
 static char *p = NULL;                       //定义一个静态的字符指针  p
 if(buff == NULL && (buff = p) == NULL)    //这个if语句特别重要,解决第一个参数传入的问题
 {                                       //第一个参数是buff不为NULL,if第一条buff == NULL就为非
  return NULL;                  //不执行后面的赋值语句和判断语句,
                                          //如果为空就把buff 赋值成 p
 }
 char *t = buff;                //这个是遍历buff字符串用的
 char *s = NULL;           //这个是遍历delimit分割符用的
            
 while(*t != '\0' )         //第一层遍历buff
 {
  s = delimit;               //把分割符号的地址赋给s
  while( *s != '\0')         //遍历分割符里面的元素
  {
   if(*s == *t)               //如果分割符里面的字符命中了
   {
    p = t+1;                  //把t+1的地址赋给静态指针  
    if( t == buff)             //如果刚开始就命中了分割符
    {
     buff = p;                 //buff 等于t+1
                    //把刚刚在buff中发现的命中分割符给置成\0
      break;                //跳出这层循环,因为现在一块都没切出来,不break,会被下面的语句return出去
    }
    *t = '\0';          
    return buff;
   }
            s++;
  }
        t++;
 } 
 
 if(buff != NULL)
 {
	 return buff;
	 p = NULL;
 }
  return NULL;
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!