1.strtko
1.1 函数原型
char * strtok (char *str, const char * delimiters);
参数:str,待分割的字符串(c-string);
delimiters,分割符字符串。
返回值:调用成功则返回指向被分割出片段的指针,失败返回NULL。
功能:当在参数str的字符串中发现参数delimiters中包涵的分割字符时,则会将该字符改为\0 字符。
1.2 使用说明
- delimiters是分割符的集合,是字符串,不是字符,要用双引号;
- 在第一次调用时,strtok()必需给予参数str字符串,往后的调用则将参数str设置成NULL;
- 第一次分割之后,剩余的字符串存储在一个静态变量中,因此多线程同时访问该静态变量时,则会出现错误;
- 使用该函数进行字符串分割时,会破坏被分解字符串的完整,调用前和调用后的str已经不一样,若还需使用原字符串注意拷贝保留。
1.3 例子
#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);
ptr = strtok(NULL, ",");
}
system("pause");
return 0;
}
2. strtko_s
strtok_s是windows下的一个分割字符串安全函数。
函数原型:
char *strtok_s( char *strToken, const char *strDelimit, char **buf);
参数:
这个函数将剩余的字符串存储在buf变量中,而不是静态变量中,从而保证了安全性。
例子1:
将字符串"hello world,my name is chentiancai.“按照”,"分割。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char str[] = "hello world,my name is chentiancai.";
char *p[8];
char *buf;
p[0]=strtok_s(str, ",",&buf);
int i = 0;
while (p[i])
{
i++;
p[i] = strtok_s(NULL, ",", &buf);
}
p[i] = "\0";
for (int i = 0; i < 3; i++)
{
printf("%s \n",p[i]);
}
例子2:
将字符串"按照",“和” "连续分割。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char str[] = "hello world,my name is chentiancai.";
char *p[8];
char *buf;
char *buftmp;
char array[size(str)]
char *strtmp = array;
strcpy(strtmp, str);
//p[0] = strtok_s(strtmp, ",", &buf);
int i = 0;
while (p[i] = strtok_s(strtmp, ",", &buf))
{
strtmp = p[i];
//p[i] = strtok_s(strtmp, " ", &buftmp);
while (p[i] = strtok_s(strtmp, " ", &buftmp))
{
i++;
//p[i] = strtok_s(NULL, " ", &buftmp);
strtmp = NULL;
}
//p[i] = strtok_s(NULL, ",", &buf);
strtmp = NULL;
}
//p[i] = "\0";
for (int j = 0; j < i; j++)
{
printf("%s \n",p[i]);
}
3.strtko_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;
}