CJSON 解析数值代码实现:parse_number 函数详解

本代码段实现 CJSON 库中用于解析 JSON 字符串中的数值的函数 parse_number。该函数接收一个 CJSON 节点指针 node 和一个包含数值的字符串指针 str 作为参数,解析 str 中的数值并存储在 node 中。

const char* parse_number(CJSON *node, const char *str)
{
    char *endptr;
    node->type = cJSON_Number;
    node->valueDouble = strtod(str, &endptr);
    if (endptr == str) {
        return 'Invalid number format';
    }
    if (floor(node->valueDouble) == node->valueDouble && node->valueDouble <= INT_MAX && node->valueDouble >= INT_MIN) {
        node->valueInt = (int)node->valueDouble;
        node->type = cJSON_Int;
    }
    return endptr;
}

代码解析:

  1. node->type = cJSON_Number;: 将节点类型设置为 cJSON_Number
  2. node->valueDouble = strtod(str, &endptr);: 使用 strtod 函数将字符串 str 转换为双精度浮点数,并将转换后的数值存储在 node->valueDouble 中。endptr 指针指向字符串中第一个未被转换的字符。
  3. if (endptr == str) { return 'Invalid number format'; }: 如果 endptr 指针与 str 指针相同,则表示 strtod 函数无法解析字符串中的数值,返回错误信息 'Invalid number format'。
  4. if (floor(node->valueDouble) == node->valueDouble && node->valueDouble <= INT_MAX && node->valueDouble >= INT_MIN) { ... }: 判断解析的数值是否为整数。如果满足条件,则将数值存储在 node->valueInt 中,并将节点类型设置为 cJSON_Int
  5. return endptr;: 返回 endptr 指针,指示下一个字符的位置。

总结:

parse_number 函数通过 strtod 函数解析字符串中的数值,并根据数值类型自动选择存储为整型或浮点型。该函数是 CJSON 库中解析 JSON 字符串的核心函数之一,为高效便捷地解析 JSON 数值提供了方便。

CJSON 解析数值代码实现:parse_number 函数详解

原文地址: https://www.cveoy.top/t/topic/ouP9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录