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

使用C语言sscanf提取JSON首个键值对时遇终止符问题求助

解决C语言提取JSON首个键值对的问题

问题原因

你使用的sscanf(rosa, "%[}}]s", rosa);达不到预期效果,核心原因有两个:

  1. %[]格式符的字符集合中重复字符无意义,%[}}]等价于%[}],只会匹配连续的}字符,遇到非}的逗号就停止扫描;
  2. sscanf根本无法处理JSON的嵌套结构,它没有能力跟踪大括号的嵌套层级,这种工具只适合简单的字符匹配场景。

手动解析方案

要正确提取首个键值对,必须手动遍历字符串并跟踪大括号的嵌套深度,代码示例如下:

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

int main() {
    char rosa[1024] = "\"358\":{\"myItem\":12,\"1\":{1,0},\"2\":{0, 0}},\"352\":1";
    char *ptr = rosa;
    int brace_depth = 0;
    int end_pos = -1;

    // 定位首个对象的起始大括号
    while (*ptr != '\0' && *ptr != '{') {
        ptr++;
    }
    if (*ptr == '{') {
        brace_depth = 1;
        ptr++;
        // 遍历字符串,跟踪大括号嵌套层级
        while (*ptr != '\0' && brace_depth > 0) {
            if (*ptr == '{') {
                brace_depth++;
            } else if (*ptr == '}') {
                brace_depth--;
                // 层级回到0时,找到首个对象的闭合位置
                if (brace_depth == 0) {
                    end_pos = ptr - rosa;
                    break;
                }
            }
            ptr++;
        }
    }

    if (end_pos != -1) {
        // 截取完整的首个键值对
        char result[1024];
        strncpy(result, rosa, end_pos + 1);
        result[end_pos + 1] = '\0';
        printf("提取结果:%s\n", result);
    } else {
        printf("未找到匹配的闭合大括号\n");
    }
    return 0;
}

代码逻辑说明

  1. 先遍历字符串,定位到首个JSON对象的起始大括号{,初始化层级深度为1;
  2. 继续遍历后续字符:遇到{则层级加1,遇到}则层级减1;
  3. 当层级回到0时,说明找到了与起始大括号匹配的闭合},记录该位置;
  4. 截取从字符串开头到该位置的内容,即可得到完整的首个键值对。

内容的提问来源于stack exchange,提问作者rosa.tarraga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:35:03