strtok、strtok_s、strtok_r 字串分割函式
阿新 • • 發佈:2019-01-30
1、strtok函式
函式原型:char * strtok (char *str, const char * delimiters);引數:str,待分割的字串(c-string);delimiters,分割符字串。
該函式用來將字串分割成一個個片段。引數str指向欲分割的字串,引數delimiters則為分割字串中包含的所有字元。當strtok()在引數s的字串中發現引數delimiters中包涵的分割字元時,則會將該字元改為\0 字元。在第一次呼叫時,strtok()必需給予引數str字串,往後的呼叫則將引數str設定成NULL。每次呼叫成功則返回指向被分割出片段的指標。
需要注意的是,使用該函式進行字串分割時,會破壞被分解字串的完整,呼叫前和呼叫後的str已經不一樣了。第一次分割之後,原字串str變成分割完成之後的第一個字串,剩餘的字串儲存在一個靜態變數中,因此多執行緒同時訪問該靜態變數時,則會出現錯誤。 strtok例子:
-
#include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int main()
- {
- char str[]="ab,cd,ef";
- char *ptr;
- printf("before strtok: str=%s\n",str);
- printf("begin:\n");
- ptr = strtok(str, ",");
- while(ptr != NULL)
- {
- printf("str=%s\n",str);
-
printf("ptr=%s\n"
- ptr = strtok(NULL, ",");
- }
- system("pause");
- return 0;
- }
before strtok: str=ab,cd,ef
begin:
str=ab
ptr=ab
str=ab
ptr=cd
str=ab
ptr=ef
2、strtok_s函式
strtok_s是windows下的一個分割字串安全函式,其函式原型如下:char *strtok_s( char *strToken, const char *strDelimit, char **buf);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[]="ab,cd,ef";
char *ptr;
printf("before strtok: str=%s\n",str);
printf("begin:\n");
char *pTmp = NULL;
ptr = strtok_s(str, ",", &pTmp);
while(ptr != NULL)
{
printf("str=%s\n",str);
printf("ptr=%s\n",ptr);
ptr = strtok(NULL, ",");
}
system("pause");
return 0;
}
3、strtok_r函式
strtok_s函式是linux下分割字串的安全函式,函式宣告如下: char *strtok_r(char *str, const char *delim, char **saveptr);該函式也會破壞帶分解字串的完整性,但是其將剩餘的字串儲存在saveptr變數中,保證了安全性。 例子:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int main()
- {
- char str[]="ab,cd,ef";
- char *ptr;
- char *p;
- printf("before strtok: str=%s\n",str);
- printf("begin:\n");
- ptr = strtok_r(str, ",", &p);
- while(ptr != NULL){
- printf("str=%s\n",str);
- printf("ptr=%s\n",ptr);
- ptr = strtok_r(NULL, ",", &p);
- }
- return 0;
- }
begin:
str=ab
ptr=ab
str=ab
ptr=cd
str=ab
ptr=ef