首先让我说我不是 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 的目的是什么?
对此的任何见解都会非常有帮助。