You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套调用strtok()分割字符串未达预期,求技术解决方案

解决strtok()分层分割时循环仅执行一次的问题

问题根源

strtok() 依赖静态全局变量保存分割上下文,嵌套调用(比如先按|分割,再在子串里按;分割)会直接覆盖之前的上下文状态,导致外层分割循环丢失进度,只能执行一次。另外如果直接传入只读字符串字面量,strtok() 修改原字符串的操作会触发未定义行为,也可能导致异常。

解决方案

改用可重入版本的strtok_r()(POSIX标准)或Windows下的strtok_s(),这类函数允许手动传入上下文指针,彻底避免嵌套调用时的上下文冲突。同时必须确保输入字符串是可修改的(若为只读字面量,需先复制到可写缓冲区)。

示例代码

以下是用strtok_r()实现三层分割的完整可运行代码:

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

int main() {
    // 复制输入到可写缓冲区(避免直接操作只读字面量)
    char input[] = "cat my_books.txt|ls;cd /home|echo hello world";
    char *save_ptr1, *save_ptr2, *save_ptr3;

    // 第一层:按「|」分割
    char *token1 = strtok_r(input, "|", &save_ptr1);
    while (token1 != NULL) {
        // 第二层:按「;」分割
        char *token2 = strtok_r(token1, ";", &save_ptr2);
        while (token2 != NULL) {
            // 第三层:按空格分割
            char *token3 = strtok_r(token2, " ", &save_ptr3);
            while (token3 != NULL) {
                printf("%s\n", token3);
                token3 = strtok_r(NULL, " ", &save_ptr3);
            }
            token2 = strtok_r(NULL, ";", &save_ptr2);
        }
        token1 = strtok_r(NULL, "|", &save_ptr1);
    }

    return 0;
}

关键注意事项

  • 每层分割必须使用独立的上下文指针(如示例中的save_ptr1/save_ptr2/save_ptr3),确保各层分割状态互不干扰。
  • 禁止直接将字符串字面量传入strtok()系列函数,必须复制到可写的char数组中。
  • 若无法使用可重入版本,需先完成外层所有分割并保存子串到数组,再逐个处理内层分割,绝对不能嵌套调用strtok()。

内容的提问来源于stack exchange,提问作者Devon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:31:04