c庫函式之分割字串

2021-06-18 16:31:35 字數 1696 閱讀 5627

函式原型:

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指向要分解的字串,之後再次呼叫...