[嵌入式 C 语言] 字符串处理函数

一、字符串分割函数  strtok_r

        strtok_r 是一个用于字符串操作的 C 标准库函数,它的作用是从一个字符串中分割出子字符串。strtok_r 是线程安全的版本,相比于 strtok 更适合在多线程环境中使用,因为它使用额外的参数来跟踪状态,而不是依赖于全局变量。

1.1 函数原型

strtok_r 的原型定义在 <string.h> 头文件中,其定义如下:

char *strtok_r(
    char *strtok,
    const char *delim,
    char **save_ptr
);

1.2 参数说明

  • strtok: 指向要进行分割的字符串。
  • delim: 一个字符串,包含分割符。如果 delim 中有多个字符,那么每个字符都会被视为一个分割符。
  • save_ptr: 一个指向 char * 类型的指针。这个指针用于保存中间状态,使得 strtok_r 可以被多次调用来分割同一个字符串。

1.3 返回值

  • 如果成功找到一个子字符串,strtok_r 返回指向该子字符串的指针。
  • 如果找不到子字符串(即已经分割完整个字符串),strtok_r 返回 NULL

1.4 使用示例

假设有一个字符串 "a,b,c,d,e",我们想按照逗号 , 来分割它:

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

int main() {
    char str[] = "a,b,c,d,e";
    char *save_ptr;
    char *token;

    // 第一次调用
    token = strtok_r(str, ",", &save_ptr);
    while (token != NULL) {
        printf("%s\n", token);
        // 后续调用
        token = strtok_r(NULL, ",", &save_ptr);
    }

    return 0;
}

 输出结果将是:

a
b
c
d
e

1.5 工作原理

  1. 当首次调用 strtok_r 时,需要传递字符串的起始地址和分割符以及一个初始化为 NULL 的 save_ptr
  2. strtok_r 会在字符串中查找第一个不在 delim 中的字符,并返回指向该字符的指针。
  3. 在找到第一个不在 delim 中的字符之后,strtok_r 会继续查找下一个在 delim 中的字符,并将这些字符之前的子字符串作为结果返回。
  4. 每次调用 strtok_r 都会更新 save_ptr,使其指向当前处理位置之后的字符。
  5. 当再次调用 strtok_r 时,只需要传递 NULL 作为第一个参数,save_ptr 会记住上次调用的位置,从而继续分割剩余的部分。
  6. 当整个字符串都被分割完毕后,strtok_r 将返回 NULL

1.6 注意事项

  • strtok_r 会修改原字符串,所以在不希望修改原字符串的情况下,应先复制一份再进行分割。
  • 如果在多线程环境中使用 strtok,可能会因为全局状态导致不可预测的结果,因此推荐使用 strtok_r
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值