【问题标题】:C parsing URL parameters GET/POST using sscanf to JSONC 使用 sscanf 将 URL 参数 GET/POST 解析为 JSON
【发布时间】:2019-12-08 23:02:57
【问题描述】:

有这个字符串(str):

ip=127.0.0.1&server=localhost&uri=/&vers=0.56&total_processed=21&total_blocked=20&config=learning&cscore0=$XSS&score0=16&zone0=ARGS&id0=1302&var_name0=a&zone1=ARGS&id1=1303&var_name1=a

想用纯 C 语言生成 JSON,比如 key:value 即 ip: 127.0.0.1 等

试过这段代码:

  struct key_value
  {
    char key[128];
    char value[128];
  };

  int number_of_keys = 50;
  struct key_value *kv = malloc(sizeof(struct key_value) * number_of_keys);
  if (kv == NULL) {
      perror("Malloc");
      exit(EXIT_FAILURE);
  }
  char delim[] = "&";



  char *ptr = strtok((char *)((ngx_str_t *)ostr->elts)[0].data, delim);
  int j=0;
    while(ptr != NULL)
    {
        sscanf(ptr,"%[^=]=%[^\n]",kv[j].key,kv[j].value);
        ptr = strtok(NULL, delim);
        j=j+1;

    }



  ngx_log_error(NGX_LOG_ERR, r->connection->log,
          0, "{ %s:%s }", kv[0].key, kv[0].value);

但是忘记了如何使用未知元素计数创建一个函数来访问/格式化它???上面我只添加了 2 %s ...但它可以更多

上面的代码在速度和可靠性上有什么改进吗?

谢谢,

【问题讨论】:

  • 你为什么要strtok呢?就while(sscanf(...) == 2)
  • 是否需要在输出之前将结果存储在结构/数组中?
  • 找到一个可以做到这一点的库?
  • sscanf() 或类似的方式处理一般的JSON 将是一个令人沮丧的练习。获取 JSON 库——JSON 网站上列出了许多可供选择的库。
  • @dvhh — 哦,是的;也许Using scanf() in a loop 更相关(尽管生成正确的 JSON 也并非完全简单,尽管它比解析 JSON 要简单得多)。

标签: c json string scanf


【解决方案1】:

strcspn 可用于遍历字符串并划分为子字符串。
它会将字符数提供给下一个分隔符或终止零。
使用strncpy 将字符复制到另一个数组。
设置终止零。

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

int main ( void) {
    char line[] = "ip=127.0.0.1&server=localhost&uri=/&vers=0.56&total_processed=21"
    "&total_blocked=20&config=learning&cscore0=$XSS&score0=16&zone0=ARGS&id0=1302"
    "&var_name0=a&zone1=ARGS&id1=1303&var_name1=a";
    char key[128] = "";
    char value[128] = "";
    char *item = line;//set pointer to start of line
    size_t span = 0;

    while ( *item) {
        span = strcspn ( item, "=");//count characters to next =
        if ( span >= sizeof key) {
            fprintf ( stderr, "key sub-string too long\n");
            exit ( EXIT_FAILURE);
        }
        strncpy ( key, item, span);//copy those characters to key
        key[span] = 0;//zero terminate
        printf ( "%-30s", key);
        fflush ( stdout);//no newline in printf so force output
        item += span;//advance pointer by count of characters
        item += !!*item;//!!*item add one if not terminating zero, count does not include =
        span = strcspn ( item, "&");
        if ( span >= sizeof value) {
            fprintf ( stderr, "value sub-string too long\n");
            exit ( EXIT_FAILURE);
        }
        strncpy ( value, item, span);
        value[span] = 0;
        printf ( "%s\n", value);
        item += span;
        item += !!*item;
    }

    return 0;
}

【讨论】:

    猜你喜欢
    • 2011-01-15
    • 2021-12-12
    • 2011-01-08
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2011-01-30
    • 2014-07-04
    • 1970-01-01
    相关资源
    最近更新 更多