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

不用strtok函数:先按空格再按=分割字符串并提取数值

手动实现按=分割token并提取数值(无需strtok)

哈哈,这个需求很常见嘛!既然你已经搞定了不用strtok按空格分割字符串的部分,那针对每个token按=分割提取数值的逻辑其实是换汤不换药——核心就是手动遍历字符串定位分隔符,再截取目标内容。我给你理清楚步骤,再附上实用的C语言示例代码:

核心步骤

  • 遍历每一个已经按空格分割好的token:不管你是用指针记录起始位置,还是用索引+长度存储token,先拿到单个token的完整内容。
  • 在token内定位=符号:从token的起始位置逐个字符遍历,直到找到=或者走到token末尾(一定要判断是否存在=,避免非法格式导致越界)。
  • 提取=后的数值内容:找到=后,它的下一个字符就是数值的起始点;如果=后面有多余空格,还可以加个逻辑跳过这些空白字符,确保拿到干净的数值。
  • 处理边界情况:如果token里没有=,或者=后面没有内容,记得跳过这类无效token,或者做错误提示。

示例代码(C语言)

假设你已经实现了空格分割token的逻辑,这里把完整流程整合起来:

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

#define MAX_TOKENS 100    // 最大token数量,按需调整
#define MAX_VALUE_LEN 100 // 单个数值的最大长度,按需调整

int main() {
    char input[] = "width=800 height=600  fps=30   volume=75 invalid_token";
    char *current_ptr = input;
    char *tokens[MAX_TOKENS];
    int token_count = 0;
    char extracted_values[MAX_TOKENS][MAX_VALUE_LEN];
    int value_count = 0;

    // --------------------------
    // 第一步:按空格分割token(你已实现的部分,这里给个参考实现)
    // --------------------------
    while (*current_ptr != '\0') {
        // 跳过token前的所有空白字符(空格、制表符等)
        while (isspace((unsigned char)*current_ptr)) {
            current_ptr++;
        }
        if (*current_ptr == '\0') break; // 提前结束,避免空token

        // 记录当前token的起始地址
        tokens[token_count++] = current_ptr;

        // 走到当前token的末尾(下一个空白或字符串结束)
        while (*current_ptr != '\0' && !isspace((unsigned char)*current_ptr)) {
            current_ptr++;
        }

        // 如果不是字符串结尾,把空白字符改成'\0',分割出当前token
        if (*current_ptr != '\0') {
            *current_ptr = '\0';
            current_ptr++;
        }
    }

    // --------------------------
    // 第二步:对每个token按=分割,提取数值
    // --------------------------
    for (int i = 0; i < token_count; i++) {
        char *token = tokens[i];
        char *equal_sign = token;

        // 在当前token里找=的位置
        while (*equal_sign != '\0' && *equal_sign != '=') {
            equal_sign++;
        }

        // 检查是否找到有效=(存在=且后面有内容)
        if (*equal_sign == '=' && *(equal_sign + 1) != '\0') {
            char *value_start = equal_sign + 1;

            // 可选:跳过=后面的空白字符(比如处理"key=  123"这种情况)
            while (isspace((unsigned char)*value_start)) {
                value_start++;
            }

            // 把数值复制到新缓冲区,用strncpy避免溢出
            strncpy(extracted_values[value_count], value_start, MAX_VALUE_LEN - 1);
            extracted_values[value_count][MAX_VALUE_LEN - 1] = '\0'; // 确保字符串结尾
            value_count++;
        } else {
            // 处理无效token的情况,比如跳过或打印提示
            printf("Skipping invalid token: %s\n", token);
        }
    }

    // 打印提取结果
    printf("\nExtracted values:\n");
    for (int i = 0; i < value_count; i++) {
        printf("- %s\n", extracted_values[i]);
    }

    return 0;
}

关键细节说明

  • 用isspace而不是直接判断' ':可以处理所有空白字符(比如制表符\t),逻辑更鲁棒。
  • 缓冲区大小要按需调整:MAX_TOKENS和MAX_VALUE_LEN要根据你的实际输入规模设置,避免溢出。
  • 可选的空白处理:如果你的场景中=后面可能有空格,那跳过空白的逻辑很有用;如果确定没有,可以去掉这部分。
  • 内存安全:用strncpy代替strcpy,避免数值过长导致缓冲区溢出;同时手动添加字符串结束符'\0'。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:06:08