stork函数

strtok 是 C 语言标准库中的一个函数,用于将字符串分割成一系列标记(tokens)。这个函数声明在 <string.h> 头文件中。

函数原型

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

参数

  • str:要分割的字符串。首次调用时传入需要分割的字符串,后续调用时传入 NULL
  • delim:一个字符串,包含所有分割符(delimiters)。strtok 会在遇到这些字符时将字符串分割。

返回值

  • 返回指向被分割字符串中第一个标记的指针。
  • 如果没有更多的标记,返回 NULL

工作原理

  1. 首次调用:传入需要分割的字符串,strtok 会找到第一个标记并将其返回,同时将字符串的当前位置保存在内部静态变量中。
  2. 后续调用:传入 NULL 作为字符串,strtok 会继续从上次分割的位置开始,找到下一个标记并将其返回。

使用示例

下面是一个使用 strtok 函数的示例:

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, world! Welcome to C programming.";
    const char delim[] = " ,.!";

    // 获取第一个标记
    char *token = strtok(str, delim);

    // 继续获取后续标记
    while (token != NULL) {
        printf("Token: %s\n", token);
        token = strtok(NULL, delim);
    }

    return 0;
}

解释

  1. 初始化字符串和分隔符

    char str[] = "Hello, world! Welcome to C programming.";
    const char delim[] = " ,.!";  // 分隔符包括空格、逗号、点和感叹号
    
  2. 获取第一个标记

    char *token = strtok(str, delim);
    
    • 这里 str 是要分割的字符串,delim 是分隔符字符串。
    • 返回值 token 是第一个标记(在这个例子中是 “Hello”)。
  3. 循环获取后续标记

    while (token != NULL) {
        printf("Token: %s\n", token);
        token = strtok(NULL, delim);
    }
    
    • 在循环中,strtok(NULL, delim) 继续从上次分割的位置开始获取下一个标记,直到没有更多的标记返回 NULL

注意事项

  1. 修改原字符串strtok 会修改传入的字符串,在分隔符位置插入空字符 (\0) 来分割标记。因此,传入的字符串必须是可修改的数组,而不能是字符串常量。

  2. 不可重入:由于 strtok 使用静态变量存储当前位置,因此在多线程环境下或在同一个函数中嵌套调用 strtok 会出现问题。C11 标准引入了 strtok_r,它是一个线程安全的版本。

线程安全的 strtok_r

strtok_r 的函数原型如下:

char *strtok_r(char *str, const char *delim, char **saveptr);

使用 strtok_r 可以避免静态变量的问题,因为它将当前位置保存在 saveptr 指针中:

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, world! Welcome to C programming.";
    const char delim[] = " ,.!";
    char *saveptr;

    // 获取第一个标记
    char *token = strtok_r(str, delim, &saveptr);

    // 继续获取后续标记
    while (token != NULL) {
        printf("Token: %s\n", token);
        token = strtok_r(NULL, delim, &saveptr);
    }

    return 0;
}

总结

strtok 函数是一个强大的工具,用于将字符串分割成标记。了解其工作原理和注意事项,可以帮助你在编写 C 语言代码时有效地使用它。如果需要线程安全的操作,请使用 strtok_r

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的码泰君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值