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
因為delimiters支援多個分割符, 我們將本示例中的語句行
const char * split = ",";
改成 const char * split = ",*"; //用逗號(,)和星號(*)對字串進行分割
這樣輸出結果將如下所示:
a
b
c
d
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否則就會出現錯誤