strtok strtok_r

strtok 这个函数是不可重入的函数, 同时也是线程安全的, 不能用于多线程处理。并且它会修改原字符串!

原型:char * strtok(char * s,const char * ct)

用途:在s中找出以ct中的字符为分隔的字符串,即是源串中除去了含有分隔串中的所有字符后余下的一段段的字符串,每调用一次找到一串,找不到则返回空串。第一次调用必须传给它有效的字符串,第二次传NULL就可以了,每次调用返回找到的子串的时候都会把源串中该子串的尾部字符(原来是搜索串中的某一字符)修改成'/0'字符返回值为每次调用得到的字串。

我们看一下它的源码:

char *___strtok;//关键这个全局指针变量

char * strtok(char * s,const char * ct)
{
 char *sbegin, *send;
 
 sbegin  = s ? s : ___strtok;//不等于NULL用原始字符串,否则用___strtok
 if (!sbegin) {
  return NULL;//结尾
 }
 sbegin += strspn(sbegin,ct);//
 if (*sbegin == '/0') {
  ___strtok = NULL;
  return( NULL );
 }
 send = strpbrk( sbegin, ct);
 if (send && *send != '/0')
  *send++ = '/0';
 ___strtok = send;
 return (sbegin);
}

其中:  ssize_t strspn(const char* s,char*accept)// 返回accept中任一字符在s中第一次出现的位置

char * strpbrk(const char * cs,const char * ct)//返回指向ct中任一字符在cs中第一次出现的位置

这个函数不难分析,___strtok指针指向除去第一个有效字串后面的位置,到这里我们应该清楚为什么第二次调用时只要传NULL就可以了,当然这里也暴露了它的缺点,就是说不能有两个线程同时使用strtok否则就会出现错误.



strtok_r 这个函数既是可重入的,也是线程安全的.

带有_r的函数主要来自于UNIX下面。所有的带有_r和不带_r的函数的区别的是:带_r的函数是线程安全的,r的意思是reentrant,可重入的。

你可能感兴趣的:(多线程,unix,null)