3. 数值解析
3. 数值解析
章节目录
先来设计函数声明, 就第二节说的: static int __parse_json_number(const char* cursor, const char** end, double* num)
解析数值的步骤很简单, 我们可以直接调用标准库中的double strtod(const char *nptr, char **endptr);
进行处理, 返回值double刚好就是我们想要的.
但是在调用这个函数之前需要进行一系列的判断, 因为JSON标准对数值有一定的要求.
直接上代码
static int __parse_json_number(const char *cursor, const char **end, double *num)
{
const char *p = cursor;
if (*p == '-')
{
p++;
}
if (*p == '0' && (isdigit(p[1]) || p[1] == 'X' || p[1] == 'x'))
{
return -2;
}
*num = strtod(cursor, (char **)end);
if (cursor == *end)
{
return -2;
}
return 0;
}
首先第一个字符如果是负号-
, ++继续判断下一个字符
当前字符为'0'
, 且
- 下一个字符为十进制数, 表示当前数值为八进制, 不允许, 返回错误.
- 下一个字符为X或x, 表示当前数值为十六进制, 不允许, 返回错误.
最后将cursor直接转为double, 如果转换失败, 则返回错误, 成功则退出.