【问题标题】:How to parse json using sscanf in C?如何在 C 中使用 sscanf 解析 json?
【发布时间】:2020-04-24 10:04:19
【问题描述】:

我有以下json形式的字符串:

{"num":1,"data":{"city":"delhi"}}

我需要使用sscanf 获取“num”键的值。这是我的尝试。我知道这是不正确的。但我不知道该怎么做。

#include <stdio.h>
#include <stdlib.h>

int main(void) {

    char *str = "{\"num\":1,\"data\":{\"city\":\"delhi\"}}";
    char *ret = malloc(sizeof(char) * 10);

    sscanf(str, "{\"num\":%s, %s" , ret);

    printf("%s", ret);
    return 0;
}

有什么建议吗?

【问题讨论】:

  • 不要使用 sscanf。 JSON 太复杂了。请改用适当的 JSON 解析器。
  • 有两种可能性:如果您确定字符串完全采用这种方式int num = atoi(strchr(str, ':')+1); 格式化,则使用肮脏的hack;如果字符串可以变化,则使用json解析器。
  • @OliverMason,除了 sscanf 和正则表达式,我别无选择。我的整个实现都是用 C 语言实现的。我什至不能使用第三方插件、库等。
  • @Ctx,我认为您的方法可行,因为我的字符串具有固定格式。非常感谢。
  • 为此使用 sscanf 是一个糟糕的主意。这是一个完全用 ANSI(便携式)C 编写的非常轻量级的 JSON 解析器。您可以将其放入您的项目中:github.com/udp/json-parser

标签: c scanf


【解决方案1】:
sscanf(str, "{\"num\":%s, %s" , ret);

错了,首先你有两个“%s”但是你只给了一个位置来保存字符串(ret),它并没有像你期望的那样提取

你想要的

#include <stdio.h>
#include <stdlib.h>

int main(void) {

    char *str = "{\"num\":1,\"data\":{\"city\":\"delhi\"}}";
    char *ret = malloc(10); /* by definition sizeof(char) is 1 */

    if (sscanf(str, "{\"num\":%9[^,]" , ret) == 1)
        printf("value is '%s'\n", ret);

    free(ret);
    return 0;
}

编译和执行

/tmp % gcc -Wall p.c
/tmp % ./a.out
value is '1'
/tmp % 

但是使用scanf来解析是有限的

【讨论】:

  • 正是我想要的。非常感谢。我正在使用 sscanf 因为我的 json 是固定长度和固定格式的。所以,这会奏效。
  • @no_one 太好了。当您使用 scanf 函数之一读取/提取时,我建议您始终检查返回值以了解获得了多少元素,以及何时限制 scanf 的长度的字符串 将写入(这里 9 甚至字符串的大小为 10,因为即使写入结尾的空字符也不计数)
猜你喜欢
  • 2011-01-08
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
相关资源
最近更新 更多