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

使用strtok_r()从字符数组提取多字符串遇问题求助

问题分析与解决方案

你遇到的核心问题是针对不同字段的分割逻辑不一致,导致paw字段解析失败。我们先拆解现有代码的问题,再给出更简洁统一的解析方案。

现有代码的问题

看你处理paw的这段逻辑:

temp = strtok_r(arg,"paw", &p_temp);
temp = strtok_r(temp,"=", &p_temp);

当arg是"paw=password"时,第一次用"paw"作为分隔符,strtok_r会跳过开头的"paw",返回空字符串(因为分隔符在最开头),第二次用"="分割空字符串自然得到NULL。

而你处理tz时用了"tz="作为分隔符,虽然能拿到值,但这种每个字段写不同分割规则的方式不仅冗余,还容易出错。

更优的统一解析方案

URL参数的解析逻辑本就很统一:先把?后的参数部分用&分割成单个键值对,再把每个键值对用=分割成key和value。用strtok_r完全可以用一套逻辑处理所有参数,不需要针对每个key写特殊逻辑。

改进后的代码如下:

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

int main(int argc, char **argv){ 
    char resp[] = "INCOMING,1,443:GET /send?to=12&paw=password&tz=3 HTTP/1.1"; 
    char *arg; 
    char *p_arg; 
    char *param;
    char *p_param;
    char *key, *value;

    printf("resp is: %s\n",resp); 

    // 跳过前两个逗号分隔的字段
    arg = strtok_r(resp, ",", &p_arg);
    arg = strtok_r(NULL, ",", &p_arg);
    printf("first num = %s\n", arg); 

    // 跳过到?之前的内容,拿到参数部分(用空格分割,避免后续遇到HTTP/1.1干扰)
    strtok_r(NULL,"?", &p_arg); 
    arg = strtok_r(NULL," ", &p_arg); 
    printf("params string: %s\n", arg); 

    // 解析每个参数键值对
    param = strtok_r(arg, "&", &p_param);
    while(param != NULL){
        // 分割key和value
        key = strtok_r(param, "=", &p_arg);
        value = strtok_r(NULL, "=", &p_arg);
        
        if(strcmp(key, "to") == 0){
            printf("to is %s\n", value);
        } else if(strcmp(key, "paw") == 0){
            printf("paw is %s\n", value);
        } else if(strcmp(key, "tz") == 0){
            printf("tz is %s\n", value);
        }

        param = strtok_r(NULL, "&", &p_param);
    }

    return 0;
}

代码解释

  1. 提取参数部分:用strtok_r(NULL," ", &p_arg)代替原来的?分割后直接处理,能准确拿到?到HTTP/1.1之间的完整参数串,避免后续处理时遇到空格出错。
  2. 统一解析键值对:
    • 先用&分割出每个key=value格式的参数。
    • 再对每个参数用=分割成key和value,不管是to、paw还是tz,都用同一套逻辑处理。
  3. 扩展性:新增参数时只需要在判断分支里加新的key即可,不需要修改核心解析逻辑。

关于解析方式的最优性

用strtok_r(线程安全版的strtok)处理这类结构化字符串是高效且易读的选择。相比strchr需要手动移动指针、处理边界,strtok_r封装了分割逻辑,代码更简洁。如果是嵌入式环境或对性能要求极高,strchr手动解析可能略快,但代码复杂度会上升;大多数场景下,strtok_r的方案在可读性和效率之间平衡得很好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:59:38