C/C++分割字符串: strtok函数

C语言如何实现将字符串ABCD-efgh-i1234,David-Julie-Susan-,分隔开的几个字串ABCD efgh i1234 David Julie Susan取出来?

有个函数叫 strtok()

#include <stdio.h>
#include <string.h>
int main(void)
{
        char buf[] = "ABCD-efgh-i1234,David-Julie-Susan";
        char splitstr[6][10];
        char *tok;
        int8_t i = 0;
        tok = strtok(buf, "-");
        while (tok) 
        {
            strcpy(splitstr[i], (const char *)tok);
            printf("splitstr[%d]=%s\n",i, splitstr[i]);
            i++;
            tok = strtok(0, "-,");
        }
       return 0;
}

运行结果:

splitstr[0]=ABCD
splitstr[1]=efgh
splitstr[2]=i1234
splitstr[3]=David
splitstr[4]=Julie
splitstr[5]=Susan
1. 函数原型

char *strtok(char s[], const char *delim);
参数说明:s为要分解的字符串,delim为分隔符字符串。delim字符还可以是多个,不一定只为一个,多个字符连起来放在双引号间,上面的例子中是短横线和逗号"-,"。但是当只要遇到其中任意一个就可以分割,并不要求分隔的字符连起来才能分割。

2.定义

strtok()分解字符串为一组字符串。s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。在头文件#include<string.h>中。

3.说明
  • 当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。

  • 第一次调用时候,strtok函数从不是分隔符的第一个字符开始搜索,找到第一个是分隔符为止,将其替换为‘\0’作为结束。但是函数此时已经保存了分隔符之后的那个字符,因此后续再调用strtok时,第一个参数为NULL,继续将string标记化(切割)。NULL参数表示调用strtok继续从string中上次调用 strtok时保存的位置开始标记化。

  • 返回值
    从s开头开始的一个个被分割的字符串指针。当s中的字符查找到末尾时,即调用strtok时已经没有标记(分隔符),则strtok返回NULL。返回NULL。如果查找不到delim中的字符时,返回当前strtok的字符串的指针。所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。

  • 需要注意的是,使用该函数进行字符串分割时,会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。第一次分割之后,原字符串str是分割完成之后的第一个字符串,剩余的字符串存储在一个静态变量中,因此多线程同时访问该静态变量时,则会出现错误。

4.使用

strtok函数会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。如果要保持原字符串的完整,可以使用strchr和sscanf的组合等。

参考文献:

  1. strtok()函数详解!_人工智能_魏波-CSDN博客
  2. strtok和strsep函数详解_运维_半仙姜-CSDN博客
  3. C语言 – 字符串中根据特定字符(串)分割_C/C++_青椒*_*凤爪爪的博客-CSDN博客
  4. C语言提取被特定字符分隔的字符串中的内容_weixin_30820077的博客-CSDN博客
  5. strtok函数 的原理及一个坑_网络_xzymmd的博客-CSDN博客
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值