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
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 }
[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
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 }
[root@ test]# ./strsep
abdzxbcdefgh
tok1:ab,token:zxbcdefgh
tok1:zxb,token:defgh
總結:strsep傳回值為分割後的開始字元串,并将函數的第一個參數指針指向分割後的剩餘字元串。它适用于分割關鍵字在兩個字元串之間隻嚴格出現一次的情況。
是以通過閱讀函數實作源碼,可以靈活運用這兩個函數,為自己所用!
PS:因為函數内部會修改原字元串變量,是以傳入的參數不能是不可變字元串(即文字常量區)。
如 char *tokenremain ="abcdefghij"//編譯時為文字常量,不可修改。
strtok(tokenremain,"cde");
strsep(&tokenremain,"cde");
編譯通過,運作時會報段錯誤。