gpt4 book ai didi

c - C 中的 JSON 解析器(打印 JSON)

转载 作者:太空宇宙 更新时间:2023-11-04 07:34:02 25 4
gpt4 key购买 nike

首先声明我不是 C 语言专家。我一直在审查 JSON 解析器的代码。

我正在尝试理解这段代码。

/* Render the cstring provided to an escaped version that can be printed. */
static char *print_string_ptr(const char *str)
{
const char *ptr;
char *ptr2,*out;
int len=0;
unsigned char token;

if (!str)
return cJSON_strdup("");
ptr = str;
while ((token = *ptr) && ++len) {
if (strchr("\"\\\b\f\n\r\t", token))
len++;
else if (token < 32)
len += 5;
ptr++;
}

out = (char*)cJSON_malloc(len + 3);
if (!out)
return 0;

ptr2 = out;
ptr = str;
*ptr2++ = '\"';
while (*ptr) {
if ((unsigned char)*ptr > 31 && *ptr != '\"' && *ptr != '\\')
*ptr2++ = *ptr++;
else {
*ptr2++ = '\\';
switch (token = *ptr++) {
case '\\': *ptr2++='\\'; break;
case '\"': *ptr2++='\"'; break;
case '\b': *ptr2++='b'; break;
case '\f': *ptr2++='f'; break;
case '\n': *ptr2++='n'; break;
case '\r': *ptr2++='r'; break;
case '\t': *ptr2++='t'; break;
default:
/* escape and print */
sprintf(ptr2, "u%04x", token);
ptr2 += 5;
break;
}
}
}
*ptr2++ = '\"';
*ptr2++ = 0;
return out;
}

关于这段代码实际工作原理的一般性总结会非常棒,我的印象是它“美化”了 JSON 字符串,对吗?

乍一看似乎是用 r 替换\r,但这有什么意义呢?

我一直在研究 sprintf 的功能,但用于简单的事情,例如打印货币值或其他格式问题。但是我不知道 sprintf 函数在这里做什么:

sprintf(ptr2,"u%04x",token);ptr2+=5;

ptr2+=5 的目的是什么?

对此的任何见解都会很有帮助。

最佳答案

它所做的是将控制字符转换为您通常在 C 源代码中使用的转义序列。

if ((unsigned char)*ptr>31 && *ptr!='\"' && *ptr!='\\') 
*ptr2++=*ptr++;

这基本上是在说“如果我们有一个普通字符,如字母、数字等,只需将其直接从输入复制到输出即可。”

 else
{
*ptr2++='\\';

否则,我们将在输出中生成一个以反斜杠开头的转义序列。

     switch (token=*ptr++)
{
case '\\': *ptr2++='\\'; break;
case '\"': *ptr2++='\"'; break;
case '\b': *ptr2++='b'; break;

然后,根据找到的控制字符,它生成转义序列的第二个字符,因此输入中的实际“退格”字符(比较等于“\b”)将生成两个字符 `\' 和 'b' 在输出中。

          case '\f':      *ptr2++='f';    break;
case '\n': *ptr2++='n'; break;
case '\r': *ptr2++='r'; break;
case '\t': *ptr2++='t'; break;

同样适用于换页、换行、回车和制表符。

          default: sprintf(ptr2,"u%04x",token);ptr2+=5;   break;  

否则,将控制字符呈现为十六进制,使其变为类似于\1234

关于c - C 中的 JSON 解析器(打印 JSON),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10506475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com