1. 程式人生 > >strtok、strtok_s、strtok_r 字串分割函式

strtok、strtok_s、strtok_r 字串分割函式

1、strtok函式

函式原型:char * strtok (char *str, const char * delimiters);
引數:str,待分割的字串(c-string);delimiters,分割符字串。
該函式用來將字串分割成一個個片段。引數str指向欲分割的字串,引數delimiters則為分割字串中包含的所有字元。當strtok()在引數s的字串中發現引數delimiters中包涵的分割字元時,則會將該字元改為\0 字元。在第一次呼叫時,strtok()必需給予引數str字串,往後的呼叫則將引數str設定成NULL。每次呼叫成功則返回指向被分割出片段的指標。
需要注意的是,使用該函式進行字串分割時,會破壞被分解字串的完整,呼叫前和呼叫後的str已經不一樣了。第一次分割之後,原字串str變成分割完成之後的第一個字串,剩餘的字串儲存在一個靜態變數中,因此多執行緒同時訪問該靜態變數時,則會出現錯誤。 strtok例子:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main()  
  5. {  
  6.     char str[]="ab,cd,ef";  
  7.     char *ptr;  
  8.     printf("before strtok:  str=%s\n",str);  
  9.     printf("begin:\n");  
  10.     ptr = strtok(str, ",");  
  11.     while(ptr != NULL)
  12.     {  
  13.         printf("str=%s\n",str);  
  14.         printf("ptr=%s\n"
    ,ptr);  
  15.         ptr = strtok(NULL, ",");  
  16.     }  
  17.     system("pause");  
  18.     return 0;  
  19. }  
輸出結果如下:
before strtok:  str=ab,cd,ef
begin:
str=ab
ptr=ab
str=ab
ptr=cd
str=ab
ptr=ef

2、strtok_s函式

strtok_s是windows下的一個分割字串安全函式,其函式原型如下:
char *strtok_s( char *strToken, const char *strDelimit, char **buf);
這個函式將剩餘的字串儲存在buf變數中,而不是靜態變數中,從而保證了安全性。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char str[]="ab,cd,ef";
    char *ptr;
    printf("before strtok:  str=%s\n",str);
    printf("begin:\n");

    char *pTmp = NULL;
    ptr = strtok_s(str, ",", &pTmp);

    while(ptr != NULL)
    {
        printf("str=%s\n",str);
        printf("ptr=%s\n",ptr);
        ptr = strtok(NULL, ",");
    }
    system("pause");
    return 0;
}

3、strtok_r函式

strtok_s函式是linux下分割字串的安全函式,函式宣告如下: char *strtok_r(char *str, const char *delim, char **saveptr);
該函式也會破壞帶分解字串的完整性,但是其將剩餘的字串儲存在saveptr變數中,保證了安全性。 例子:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main()  
  5. {  
  6.     char str[]="ab,cd,ef";  
  7.     char *ptr;  
  8.     char *p;  
  9.     printf("before strtok:  str=%s\n",str);  
  10.     printf("begin:\n");  
  11.     ptr = strtok_r(str, ",", &p);  
  12.     while(ptr != NULL){  
  13.         printf("str=%s\n",str);  
  14.         printf("ptr=%s\n",ptr);  
  15.         ptr = strtok_r(NULL, ",", &p);  
  16.     }  
  17.     return 0;  
  18. }  
輸入結果: before strtok:  str=ab,cd,ef
begin:
str=ab
ptr=ab
str=ab
ptr=cd
str=ab
ptr=ef