strtok函數(shù)的作用是把字符串以規(guī)定的字符分割開:
頭文件
#include <string.h>
函數(shù)原型
char *strtok(char s[], const char *delim);
參數(shù)
- str – 要被分解成一組小字符串的字符串。
- delim – 包含分隔符的 C 字符串,。
返回值
該函數(shù)返回被分解的第一個子字符串,如果沒有可檢索的字符串,則返回一個空指針。
注意:
-
分割處理后原字符串 str 會變,變成第一個子字符串
-
strtok函數(shù)會把分割前的字符串破壞掉,即每次分割后,原來的字符串就會少掉一部分,完整性會被破壞,。
例如:第一次分割之后,原字符串str是分割完成之后的第一個字符串,剩余的字符串存儲在一個靜態(tài)變量中,因此多線程同時訪問該靜態(tài)變量時,則會出現(xiàn)錯誤
使用案例
strtok函數(shù)會破壞被分解字符串的完整,調(diào)用前和調(diào)用后的s已經(jīng)不一樣了,。如果要保持原字符串的完整,可以使用strchr和sscanf的組合等,。
#include <string.h>
#include <stdio.h>
int main () {
char str[80] = "this is - CSDN - blog";
const char s[2] = "-";
char *token;
/* 獲取第一個子字符串 */
token = strtok(str, s);
/* 繼續(xù)獲取其他的子字符串 */
while( token != NULL ) {
printf( "%s\n", token );
token = strtok(NULL, s);
}
return(0);
}
輸出
this is
CSDN
blog
拓展strtok_s與strtok_r
strtok_s函數(shù)
strtok_s是windows下的一個分割字符串安全函數(shù),其函數(shù)原型如下:
char *strtok_s( char *strToken, const char *strDelimit, char **buf);
這個函數(shù)將剩余的字符串存儲在buf變量中,而不是靜態(tài)變量中,從而保證了安全性。
strtok_r函數(shù)
strtok_s函數(shù)是linux下分割字符串的安全函數(shù),函數(shù)聲明如下:
char *strtok_r(char *str, const char *delim, char **saveptr);
該函數(shù)也會破壞待分解字符串的完整性,但是其將剩余的字符串保存在saveptr變量中,保證了安全性,。
拓展用例:
linux C:
#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){
// 輸出時候 str都是 ab 也會被切割 破壞待分解字符串的完整性
printf("str=%s\n",str);
printf("ptr=%s\n",ptr);
ptr = strtok_r(NULL, ",", &p);
}
return 0;
}
輸入結(jié)果:
before strtok: str=ab,cd,ef
begin:
str=ab
ptr=ab
str=ab
ptr=cd
str=ab
ptr=ef