strtok函数 的原理及一个坑

我们知道strtok是一个字符串切割函数,先来了解一下它

原型: char *strtok(char *str, const char *delim);

功能:分解字符串为一组字符串。

参数说明:str为要分解的字符串,delim为分隔符字符串。

原理:找到分隔符,并用'\0'代替,即字符串的结束符。

返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。

再看一个简单应用


//借助strtok实现split
#include <string.h>
#include <stdio.h>
 
int main()
{
    char s[] = "Hello world,engineers!~";
    const char *d = " ,!";//以空格,逗号和感叹号作为分隔符,注意是可以取多个的
    char *p;
    p = strtok(s,d);
    while(p)
    {
        printf("%s\n",p);
        p=strtok(NULL,d);
    }
 
    return 0;
}

要特别注意的是函数的参数类型以及返回类型。

每次切割返回的是char*型的;被切割的字符串是char数字型的;切割符是const char*型的。如果被切割字符串是string类型的,可以用(char*)str.data()进行类型转换。

但有两个是不得不说的问题

坑1、函数在循环执行的时候必须先将返回值记录下来,再进行切割否则就会出现空指针的问题。

那么原因是什么呢?再让我们详细了解一下strtok函数的原理:

函数strtok保存string中标记后面的下一个字符的指针,并返回当前标记的指针。

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

如果调用strtok时已经没有标记(分隔符),则strtok返回NULL。这就是问题所在了哦!!!

如果你在while中先执行strtok函数,再打印。那么切割到最后函数返回为NULL的时候,再赋值就会出现空指针的问题。如果非要先切割再打印的话可以在打印之前做一个null判断。

坑2、还要注意strtok会修改输入字符串,如果调用strtok之后还要在程序中使用这个字符串,则应复制这个字 符串。

想尝试的人可以在上述程序中第一次切割之后打印一下s,会发现它已经变成了被切割下来的第一个东西。因此每执行一次strtok,都会改变原来的字符串。因为它将分隔符转换为‘\0’了,字符串从这里就断掉了。

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`strtok` 函数是 C 标准库一个字符串处理函数,其原型为: ```c char *strtok(char *str, const char *delim); ``` `strtok` 函数将字符串 `str` 按照分隔符 `delim` 进行分割,并且在第一次调用时,需要将 `str` 作为参数传入,以后调用时将 `str` 设置为 `NULL` 即可。调用 `strtok` 函数时,它会返回分割后的第一个子串,并且将 `str` 指向下一个子串的起始位置,直到所有子串都被返回为止。如果 `str` 已经为 `NULL`,则 `strtok` 函数将继续从上一次调用结束的位置开始搜索。 以下是一个使用 `strtok` 函数将字符串按照空格分割的例子: ```c #include <stdio.h> #include <string.h> int main() { char str[] = "hello world"; char *token = strtok(str, " "); while (token != NULL) { printf("%s\n", token); token = strtok(NULL, " "); } return 0; } ``` 输出结果为: ``` hello world ``` 在上面的代码,首先调用 `strtok(str, " ")` 函数将字符串按照空格分割,并返回第一个子串 `"hello"`。然后在循环,继续调用 `strtok(NULL, " ")` 函数,它将返回下一个子串 `"world"`,直到所有子串都被返回为止。 需要注意的是,`strtok` 函数会修改原始字符串,将分隔符替换为 `NULL`,因此如果需要保留原始字符串,需要先将原始字符串复制一份进行操作。此外,`strtok` 函数并不是线程安全的,如果需要在多线程环境下使用,需要使用 `strtok_r` 函数代替。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值