Как я могу преобразовать строку в указанную версию себя во время выполнения?

Учитывая стандартный строковый объект в C ++, который, как ожидается, будет содержать escape-последовательности, как я могу преобразовать это в саму себя в кавычную версию во время выполнения?

std::string str("Foo said, \"bar\"\n");

Учитывая вышеизложенное, я хочу создать новую строку, quoted, который имеет следующее содержание:

"\"Foo said, \\\"bar\\\"\\n\""

Это всего лишь пример. Мне нужно выполнить эту манипуляцию с произвольными строками.

Должен ли я просто сделать это вручную для каждой возможной escape-последовательности?

2

Решение

Если вы имеете дело со строковым литералом, вы можете передать его через макрос и преобразовать его в строку.

#define STRINGIFY(X) #X
std::string str(STRINGIFY("Foo said, \"bar\"\n"));

Если у вас уже есть сохраненный текст строки, и вы хотите его версию, которую вы можете выдать в виде строки, которую можно использовать в исходном коде C для представления той же строки, вам необходимо применить к тексту свою собственную строку. Это немного сложно, потому что некоторые управляющие символы имеют свои собственные экранированные представления:

std::string hex (int c) {
std::ostringstream oss;
oss << std::setw(4) << std::setfill('0') << std::hex << c;
return oss.str();
}

std::string stringify (const std::string &str) {
std::ostringstream oss;
oss << '"';
for (int i = 0; i < str.size(); ++i) {
unsigned char c = str[i];
switch (c) {
case '\t': oss << "\\t";     break;
case '\n': oss << "\\n";     break;
case '\a': oss << "\\a";     break;
case '\b': oss << "\\b";     break;
case '\r': oss << "\\r";     break;
case '\v': oss << "\\v";     break;
case '\f': oss << "\\f";     break;
case '"':  oss << "\\\"";    break;
case '\\': oss << "\\\\";    break;
default:
if (std::isprint(c)) oss << c;
else oss << "\\u" << hex(c);
break;
}
}
oss << '"';
return oss.str();
}

Возможно, вам придется расширить эту функцию, если вам нужно сбежать '?' избегать триграфов.

5

Другие решения

C ++ 14 имеет новый std::quoted манипулятор, например

std::cout << quoted(str); // defaults to '"' as the quote and '\\' as the escape

std::ostringstream oss;
oss << quoted(str);
auto quoted_string = oss.str();
6

По вопросам рекламы ammmcru@yandex.ru