c++ strtok 和 strsep 的区别

一,相同点

strtok和 strsep 都可以按指定字符截取字符串

例如:字符串 “123,b,cd,4567”,这种字符串,如果使用逗号截取,就会分割成自己想要的字符串

二,strtok的用法

第一次调用时,需要将第一个参数设置为要分割的字符串,之后的调用中应将第一个参数设置为NULL,以便从上次分割的位置继续分割。第二个参数古要传入分割符的指针。每次调用strtok时,它返回指向下一个子串的指针。当没有更多的子串可供返回时,函数返回NULL.

strtok会改变原始字符串的值,因为每次调用这个方法他会将分隔符改为\0,然后指向下一个位置

例如:

char *token = strtok("abc,def,ghi", ",");
while (token != NULL) {
    // 使用token进行后续处理
    token = strtok(NULL, ","); // 继续从上次的位置分割
}

三,strsep的用法

第一个参数需要传入字符串指针的指针,第二个参数传入分隔符的指针。调用的时候每次循环调用的时候都会返回下一个字符串的指针没有的时候返回NULL,与strtok的调用区别是,他每次调用第一个参数都传入的是要分割的字符串指针的指针,而strtok第一次是指针,后面串入的是NULL

四,分割符如果向量,区别是什么

但是但是对于分隔符相连,但是中间没有数组的情况下,strttok会跳过strsep则不会

五, strttok截取分割符相连这种情况的字符串,举例说明

void test_strtoken()

{

    char *pp[30] ={0};

    int param_count=0;

    char pchar [] = "123,b,cd,4567,,uyyyt,yy";

    char *token;

    const char *delim = ",";

    token = strtok(pchar, delim);

    pp[param_count] = token;

     printf("pp[%d]  %s\r\n",param_count,pp[param_count]);

  // 通过循环不断获取分割后的子字符串

    while ((token = strtok(NULL, delim)) != nullptr) {

        if(token != NULL)

        {

            param_count++;

            pp[param_count] = token;

             printf("pp[%d]  %s\r\n",param_count,pp[param_count]);


        }

        else

        {

            printf("token is null \r\n");

        }

    }

}

对于上面的方法,打印出来的结果是:

pp[0]  123

pp[1]  b

pp[2]  cd

pp[3]  4567

pp[4]  uyyyt

pp[5]  yy

可以看出来完全忽略了 4567后面两个逗号之间没有数据的情况,直接跳过了

六, strsep 截取分割符相连这种情况的字符串,举例说明

 如果我们使用 strsep ,应该如何实现举例如下:

void test_strsep()

{

    char *pp[30] ={0};

    int param_count=0;

    char pchar [] = "123,b,cd,4567,,uyyyt,yy";

    char *token;

    const char *delim = ",";

    char *str = pchar;

    // 通过循环不断获取分割后的子字符串

    while ((token = strsep(&str, delim)) != nullptr) {

        if(token != NULL)

        {

            pp[param_count] = token;

            printf("pp[%d]  %s\r\n",param_count,pp[param_count]);

            param_count++;

        }

        else

        {

            printf("token is null \r\n");

        }

    }

}

此时会打印如下结果:

pp[0]  123

pp[1]  b

pp[2]  cd

pp[3]  4567

pp[4] 

pp[5]  uyyyt

pp[6]  yy

这个时候会打印出 4567后面两个逗号没有值的情况,对于某些业务需要按顺序赋值的情况就不会出错了,建议使用strsep

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值