Как превратить буквенные экранированные символы в «настоящие» экранированные символы, чтобы они печатались «правильно»? - PullRequest
0 голосов
/ 03 марта 2020

Следующий код C ++ должен быть довольно простым для понимания.
В комментарии первых двух "cout" есть фактическая печать.
В третьем комментарии "cout" есть то, что я хотел бы напечатать.
Как должна выглядеть функция restore_escapes? Разве нет ничего готового к использованию?

std::string a("abc\"\tdef\n");
std::string b(R"(abc\"\tdef\n)");

std::cout << a; //abc"    def
std::cout << b; //abc\"\tdef\n
std::cout << restore_escapes(b);  //abc"    def

1 Ответ

1 голос
/ 03 марта 2020

См. Функцию glib g_strcompress , воспроизведенную здесь:

gchar *
g_strcompress (const gchar *source)
{
  const gchar *p = source, *octal;
  gchar *dest;
  gchar *q;

  g_return_val_if_fail (source != NULL, NULL);

  dest = g_malloc (strlen (source) + 1);
  q = dest;

  while (*p)
    {
      if (*p == '\\')
        {
          p++;
          switch (*p)
            {
            case '\0':
              g_warning ("g_strcompress: trailing \\");
              goto out;
            case '0':  case '1':  case '2':  case '3':  case '4':
            case '5':  case '6':  case '7':
              *q = 0;
              octal = p;
              while ((p < octal + 3) && (*p >= '0') && (*p <= '7'))
                {
                  *q = (*q * 8) + (*p - '0');
                  p++;
                }
              q++;
              p--;
              break;
            case 'b':
              *q++ = '\b';
              break;
            case 'f':
              *q++ = '\f';
              break;
            case 'n':
              *q++ = '\n';
              break;
            case 'r':
              *q++ = '\r';
              break;
            case 't':
              *q++ = '\t';
              break;
            case 'v':
              *q++ = '\v';
              break;
            default:            /* Also handles \" and \\ */
              *q++ = *p;
              break;
            }
        }
      else
        *q++ = *p;
      p++;
    }
out:
  *q = 0;

  return dest;
}
...