天天看點

strtok 與 strsep 函數說明 C++中關于strtok()函數的用法

strtok 與 strsep 函數說明

這幾天處理字元串,突然遇到字元串分割問題,上網查了一些資料後,找到這兩個函數,strtok與strsep函數。網上舉的例子千篇一律,下面我根據函數的實作源碼,記錄一下使用說明,供大家讨論,歡迎大牛拍磚!PS:找個庫函數源碼的線上查詢網站真不容易,先找到了這個http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/?cvsroot=glibc

之後,發現了經常去找軟體的oschina有源碼庫,真是踏破鐵鞋無覓處,得來全不費工夫!

http://www.oschina.net/code/explore/glibc-2.9/string/strtok.c

strtok 與 strsep 函數說明 C++中關于strtok()函數的用法
1 #include <stdio.h>
 2 #include <string.h>
 3 int main()
 4 {
 5     char token[] ="abdczxbcdefgh";
 6     printf("%s\n",token);
 7     char *tokenremain = token;
 8     char *tok1 = strtok(tokenremain,"cde");
 9     printf("tok1:%s\n",tok1);
10     tok1 = strtok(NULL,"cde");                                                                          
11     printf("tok1:%s\n",tok1);
12     return 0;
13 }      
strtok 與 strsep 函數說明 C++中關于strtok()函數的用法
[root@ test]# ./strtok 
abdczxbcdefgh
tok1:ab
tok1:zxb      

總結:strtok内部記錄上次調用字元串的位置,是以不支援多線程,可重入版本為strtok_r,有興趣的可以研究一下。它适用于分割關鍵字在字元串之間是“單獨”或是 “連續“在一起的情況。

C++中關于strtok()函數的用法

函數原型:char *strtok(char *s, const char *delim);

Function:分解字元串為一組字元串。s為要分解的字元串,delim為分隔符字元串。

Description:strtok()用來将字元串分割成一個個片段。參數s指向欲分割的字元串,參數delim則為分割字元串,當strtok()在參數s的字元串中發現到參數delim的分割字元時      則會将該字元改為\0 字元。在第一次調用時,strtok()必需給予參數s字元串,往後的調用則将參數s設定成NULL。每次調用成功則傳回被分割出片段的指針。

#include <iostream>   

#include <cstring>   

using namespace std;   

int main()   

{   

 char sentence[]="This is a sentence with 7 tokens";  

  

 cout<<"The string to be tokenized is:\n"

  <<sentence<<"\n\nThe tokens are:\n\n"; 

   

 char *tokenPtr=strtok(sentence," "); 

   

 while(tokenPtr!=NULL) {   

  cout<<tokenPtr<<'\n';   

  tokenPtr=strtok(NULL," ");   

 } 

   

 cout<<"After strtok, sentence = "<<sentence<<endl;   

 return 0;   

}   

http://www.oschina.net/code/explore/glibc-2.9/string/strsep.c

strtok 與 strsep 函數說明 C++中關于strtok()函數的用法
1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main()
 5 {
 6     char token[] ="abdzxbcdefgh";
 7     printf("%s\n",token);
 8     char *tokenremain = token;
 9     char *tok1 = strsep(&tokenremain,"cde");
10     printf("tok1:%s,token:%s\n",tok1,tokenremain);
11     tok1 = strsep(&tokenremain,"cde");                                                                  
12     printf("tok1:%s,token:%s\n",tok1,tokenremain);
13     return 0;
14 }      
strtok 與 strsep 函數說明 C++中關于strtok()函數的用法
[root@ test]# ./strsep 
abdzxbcdefgh
tok1:ab,token:zxbcdefgh
tok1:zxb,token:defgh      

總結:strsep傳回值為分割後的開始字元串,并将函數的第一個參數指針指向分割後的剩餘字元串。它适用于分割關鍵字在兩個字元串之間隻嚴格出現一次的情況。

是以通過閱讀函數實作源碼,可以靈活運用這兩個函數,為自己所用!

PS:因為函數内部會修改原字元串變量,是以傳入的參數不能是不可變字元串(即文字常量區)。

如 char *tokenremain ="abcdefghij"//編譯時為文字常量,不可修改。

strtok(tokenremain,"cde");

strsep(&tokenremain,"cde");

編譯通過,運作時會報段錯誤。