鉴于C ++中的标准字符串对象应该包含转义序列,如何在运行时将其转换为自身的引用版本?
std::string str("Foo said, \"bar\"\n");
鉴于上述情况,我想创建一个新字符串quoted
,其中包含以下内容:
"\"Foo said, \\\"bar\\\"\\n\""
这只是一个例子。我需要使用任意字符串执行此操作。
我是否只需要为每个可能的转义序列手动执行此操作?
答案 0 :(得分:6)
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();
答案 1 :(得分:5)
如果您正在处理字符串文字,则可以将其传递给宏并将其字符串化。
#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();
}
如果您需要转义'?'
以避免三字符,则可能需要扩展此功能。