使用C语言sscanf提取JSON首个键值对时遇终止符问题求助
解决C语言提取JSON首个键值对的问题
问题原因
你使用的sscanf(rosa, "%[}}]s", rosa);达不到预期效果,核心原因有两个:
%[]格式符的字符集合中重复字符无意义,%[}}]等价于%[}],只会匹配连续的}字符,遇到非}的逗号就停止扫描;- 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; }
代码逻辑说明
- 先遍历字符串,定位到首个JSON对象的起始大括号
{,初始化层级深度为1; - 继续遍历后续字符:遇到
{则层级加1,遇到}则层级减1; - 当层级回到0时,说明找到了与起始大括号匹配的闭合
},记录该位置; - 截取从字符串开头到该位置的内容,即可得到完整的首个键值对。
内容的提问来源于stack exchange,提问作者rosa.tarraga
相关产品推荐
相关产品推荐

