1. 程式人生 > >strtok函式及函式實現

strtok函式及函式實現

strtok()用來將字串分割成一個個片段。引數str指向欲分割的字串,引數delimiters則為分割字串,當strtok()在引數str的字串中發現到引數delimiters的分割字元時則會將該字元改為'\0'字元。在第一次呼叫時,strtok()必需給予引數str字串,往後的呼叫則將引數str設定成NULL。每次呼叫成功則返回下一個分割後的字串指標。 

返回值 
返回下一個分割後的字串指標,如果已無從分割則返回NULL。 

示例-1 
#include <stdio.h> 
#include <string.h> 


int main () 

char str[] ="a,b,c,d*e"; 
const char * split = ","; 
char * p; 
p = strtok (str,split); 
while(p!=NULL) 

printf ("%s\n",p); 
p = strtok(NULL,split); 

getchar(); 
return 0; 

本例中,實現對字串'a,b,c,d*e"用逗號(,)來作界定符對字串進行分割。 
輸出結果將如下所示: 



d*e 

因為delimiters支援多個分割符, 我們將本示例中的語句行 
const char * split = ","; 
改成 const char * split = ",*"; //用逗號(,)和星號(*)對字串進行分割 

這樣輸出結果將如下所示: 




e

strtok函式的原始碼如下:

    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)// 函式說明 strspn()從引數s 字串的開頭計算連續的字元,而這些字元都完全是accept 所指字串中的字元。簡單的說,若strspn()返回的數值為n,則代表字串s 開頭連續有n 個字元都是屬於字串accept內的字元。

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

    這個函式不難分析,___strtok指標指向除去第一個有效字串後面的位置,到這裡我們應該清楚為什麼第二次呼叫時只要傳NULL就可以了,當然這裡也暴露了它的缺點,就是說不能有兩個執行緒同時使用strtok否則就會出現錯誤