標籤:
1、strtok函數函數原型:char * strtok (char *str, const char * delimiters);參數:str,待分割的字串(c-string);delimiters,分割符字串。 使用方法:該函數用來將字串分割成一個個片段。參數str指向欲分割的字串,參數delimiters則為分割字串中包含的所有字元。當strtok()在參數s的字串中發現參數delimiters中包涵的分割字元時,則會將該字元改為\0 字元。在第一次調用時,strtok()必需給予參數s字串,往後的調用則將參數s設定成NULL。每次調用成功則返回指向被分割出片段的指標。 原理:作用於字串str,以包含在delimiters中的字元為分界符,將str切分成一個個子串;如果,s為空白值NULL,則函數儲存的指標SAVE_PTR在下一次調用中將作為起始位置。 注意:1.使用該函數進行字串分割時,會破壞被分解字串的完整,調用前和調用後的s已經不一樣了。第一次分割之後,原字串str是分割完成之後的第一個字串,剩餘的字串儲存在一個靜態變數SAVE_PTR中,因此多線程同時訪問該靜態變數時,則會出現錯誤。 2.delimiters中包含多字元:GNU C Library中對strtok的功能定義:“Parse S into tokens separated by characters in DELIM”。也就是說包含在delim中的字元均可以作為分隔字元,而非嚴格匹配。可以把delim理解為分隔字元的集合。這一點是非常重要的。 3.如果第一個字元就是分割字元,將自動省略掉
// crt_strtok.c// compile with: /W3// In this program, a loop uses strtok// to print all the tokens (separated by commas// or blanks) in the string named "string".//#include <string.h>#include <stdio.h>char string[] = "A string\tof ,,tokens\nand some more tokens";char seps[] = " ,\t\n"; // 字元‘,‘ ‘\t‘ ‘\n‘都作為分割字元char *token;int main( void ){ printf( "Tokens:\n" ); // Establish string and get the first token: token = strtok( string, seps ); // C4996 // Note: strtok is deprecated; consider using strtok_s instead while( token != NULL ) { // While there are tokens in "string" printf( " %s\n", token ); // Get next token: token = strtok( NULL, seps ); // C4996 }}
結果:
Tokens: A string of tokens and some more tokensProgram ended with exit code: 0
2、strtok_s函數strtok_s是windows下的一個分割字串安全函數,其函數原型如下:char *strtok_s( char *strToken, const char *strDelimit, char **buf);這個函數將剩餘的字串儲存在buf變數中,而不是靜態變數中,從而保證了安全性。3、strtok_r函數strtok_s函數是linux下分割字串的安全函數,函式宣告如下:char *strtok_r(char *str, const char *delim, char **saveptr);該函數也會破壞帶分解字串的完整性,但是其將剩餘的字串儲存在saveptr變數中,保證了安全性。
strtok、strtok_s、strtok_r 字串分割函數