Позвольте мне начать с того, что я не эксперт в C. Я просматривал код анализатора JSON.JSON Parser in C (Prints 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?
Любое понимание этого было бы действительно полезно.
Очень хорошо объяснил, на время, которое потребовалось! –