C++安全字符串分割:strtok_s详解

strtok_s 函数概述

strtok_s 是 Windows 平台提供的字符串分割函数,作为 strtok 的安全版本,解决了缓冲区溢出和多线程安全问题。该函数通过引入上下文指针避免静态变量导致的线程竞争,同时增加缓冲区长度参数防止越界访问。

函数原型与参数说明

strtok_s 的函数原型如下:

char* strtok_s(
    char* str,
    const char* delimiters,
    char** context
);
  • str: 待分割字符串,首次调用时传入原始字符串,后续调用传入 NULL
  • delimiters: 分隔符集合,支持多字符分隔
  • context: 上下文指针,保存分割状态信息

基础使用示例

以下代码演示基本分割流程:

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

int main() {
    char input[] = "apple,orange,banana";
    char* context = NULL;
    char* token = strtok_s(input, ",", &context);
    
    while (token != NULL) {
        printf("%s\n", token);
        token = strtok_s(NULL, ",", &context);
    }
    return 0;
}

输出结果:

apple
orange
banana

多分隔符处理

strtok_s 支持同时指定多个分隔符:

char data[] = "192.168.1.1;443|TCP";
char* ctx = NULL;
char* seg = strtok_s(data, ".;|", &ctx);

while (seg != NULL) {
    printf("Segment: %s\n", seg);
    seg = strtok_s(NULL, ".;|", &ctx);
}

输出结果:

Segment: 192
Segment: 168
Segment: 1
Segment: 1
Segment: 443
Segment: TCP

线程安全实现原理

传统 strtok 使用静态变量保存状态,而 strtok_s 通过 context 参数维护状态。对比以下线程不安全代码:

// 线程不安全的实现
char* unsafe_split(char* str
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值