CJSON 解析数值代码实现:parse_number 函数详解
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;
}
代码解析:
node->type = cJSON_Number;: 将节点类型设置为cJSON_Number。node->valueDouble = strtod(str, &endptr);: 使用strtod函数将字符串str转换为双精度浮点数,并将转换后的数值存储在node->valueDouble中。endptr指针指向字符串中第一个未被转换的字符。if (endptr == str) { return 'Invalid number format'; }: 如果endptr指针与str指针相同,则表示strtod函数无法解析字符串中的数值,返回错误信息 'Invalid number format'。if (floor(node->valueDouble) == node->valueDouble && node->valueDouble <= INT_MAX && node->valueDouble >= INT_MIN) { ... }: 判断解析的数值是否为整数。如果满足条件,则将数值存储在node->valueInt中,并将节点类型设置为cJSON_Int。return endptr;: 返回endptr指针,指示下一个字符的位置。
总结:
parse_number 函数通过 strtod 函数解析字符串中的数值,并根据数值类型自动选择存储为整型或浮点型。该函数是 CJSON 库中解析 JSON 字符串的核心函数之一,为高效便捷地解析 JSON 数值提供了方便。
原文地址: https://www.cveoy.top/t/topic/ouP9 著作权归作者所有。请勿转载和采集!