函式原型:
char *strtok(char *strtoken,const char *strdelimit );
引數說明:
strtoken: 包含 token 的字串, 即待分割串
strdelimit: token 的集合, strtoken 會根據這裡的每個字元進行分割
返回值:
返回指向第一段被擷取出來的字串的指標(根據 strdelimit 內的字元進行擷取). 如果沒有找到, 那麼就返回 null.
呼叫說明:
(1). 第一次呼叫 strtok 時, 第乙個引數是 strtoken, 以後再呼叫時, 第乙個引數必須是 null;
(2). 呼叫 strtok 後, 原字串會被修改;
(3). strtok 不是乙個執行緒安全的函式.
源**分析:
從 這裡 貼出的 linux 下的 string.h 的實現可以看出:
(1). strtok 使用乙個全域性定義的 char * ___strtok; 來指向擷取後的剩餘字串, 所以從第二次開始呼叫 strtok 後, 第乙個引數就只需要設為 null 就可以了;
(2). strtok 函式會在一開始就判斷其第乙個引數, 若不為 null, 就取其第乙個引數進行擷取, 並將 ___strtok 指向擷取後的字串; 若為null, 則使用 ___strtok 進行擷取, 並將 ___strtok 指向擷取後的字串;
(3). strtok 使用 sbegin 指向待擷取的字串, 當找到 strdelimit 裡的字元時, 就在這個字元前面插入 '\0', 這樣就相當於從 sbegin 指向的字串裡截取出前面一段了. 而後面一段, 則由 ___strtok 指向, 等待下一次擷取.
測試**:
// 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 #include #include char string = "a string\tof ,,tokens\nand some more tokens";
char seps = " ,\t\n";
char chinese = "中國,吃飯";
char *token;
int _tmain(int argc, _tchar* argv)
printf("原字串: %s\n", string); // 結果為 a, 說明原字串已發生改變
printf( "\n中文測試:\n");
token = strtok( chinese, ",");
while(token != null )
printf("\n");
system("pause");
return 0;
}
執行結果:
可以看到, 即使是全中文組成的字串, 也是能正確分割的; 還要注意的一點是, 呼叫 strtok 後, 原字串會被修改.
在新的 linux 2.6.29 下, 不再使用 strtok 函式, 而是改為使用更快的 strsep 替代。
字串操作之分割字串
分割字串分兩種,一類是以某個字元為key分割,一類是以某個串為key分割。以串分割的 先找到key在原字串中的位置,這個演算法就多了,kmp 然後用strcnp,strcat來操作,舉個例子,也是引出本次討論的問題,刪除 80三個字元。char p char result strchr p 5 in...
delphi之分割字串
因為喜歡用文本來記錄資料,比如帳號密碼等等,乙個遊戲帳戶一行 帳號1,密碼1,遊戲區11 帳號2,密碼2,遊戲區11 需要用到分割字串函式。delphi的classes有extractstrings函式,感覺用起來不好,後來網上找了個,如下 function splitstring pstring ...
c 字串分割函式
使用strtok函式分割。原型 char strtok char s,char delim strtok在s中查詢包含在delim中的字元並用null 0 來替換,直到找遍整個字串。功能 分解字串為一組字串。s為要分解的字串,delim為分隔符字串。說明 首次呼叫時,s指向要分解的字串,之後再次呼叫...