字符串分割函数strtko,strtko_s,strtko_r

1.strtko

1.1 函数原型

char * strtok (char *str, const char * delimiters);

参数:str,待分割的字符串(c-string);
delimiters,分割符字符串。
返回值:调用成功则返回指向被分割出片段的指针,失败返回NULL。
功能:当在参数str的字符串中发现参数delimiters中包涵的分割字符时,则会将该字符改为\0 字符。

1.2 使用说明

  1. delimiters是分割符的集合,是字符串,不是字符,要用双引号;
  2. 在第一次调用时,strtok()必需给予参数str字符串,往后的调用则将参数str设置成NULL;
  3. 第一次分割之后,剩余的字符串存储在一个静态变量中,因此多线程同时访问该静态变量时,则会出现错误;
  4. 使用该函数进行字符串分割时,会破坏被分解字符串的完整,调用前和调用后的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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值