有时,我想获取字符串的转义字符串表示形式。在这种情况下,我想打印输出到控制台,但输出可以包括任何字符(制表符,NL,CR等),我宁愿输出这些的转义序列,使其更具可读性(并在一个线)。
例如escape("hello\tworld\n") == "hello\\tworld\\n"
我是否必须为此编写自己的功能?我怀疑我这样做。
提前感谢您的回答。
答案 0 :(得分:3)
在C ++ 11之前的C ++中,您需要自己完成。在C ++ 11中,有一个“原始字符串”类型可以保留所有内容。例如,请参阅:https://en.wikipedia.org/wiki/C%2B%2B11
原始字符串由R"<delim>(<text>)<delim>"
表示&lt; delim&gt;可以是最多16个字符的字符串序列(包括空字符串)。请注意,&lt; delim&gt;中的字符存在一些限制。但这不应该是一个问题,因为你想要它可读。
所以你的例子是:
char const* str = R"(hello\tworld\n)";
答案 1 :(得分:0)
这是我写的一个基于流的解决方案(如果流成为预期目的地,你可以相应地修改):
std::string escape(std::string const &str) {
std::ostringstream result;
for (string::const_iterator it = str.begin(); it != str.end(); it++) {
if (' ' <= *it && *it <= '~') {
result << *it;
} else {
result << "\\x" << std::setw(2) << std::hex << std::setfill('0') << *it;
}
}
return result.str();
}
这是另一个使用与C / C ++相同的常见不可打印转义码:
std::string escape(std::string const &str) {
std::ostringstream result;
for (string::const_iterator it = str.begin(); it != str.end(); it++) {
if (' ' <= *it && *it <= '~') {
result << *it;
} else {
switch (*it) {
case '\a':
result << "\\a";
break;
case '\b':
result << "\\b";
break;
case '\f':
result << "\\f";
break;
case '\n':
result << "\\n";
break;
case '\r':
result << "\\r";
break;
case '\t':
result << "\\t";
break;
case '\v':
result << "\\v";
break;
default:
result << "\\x" << std::setw(2) << std::hex << std::setfill('0') << *it;
}
}
return result.str();
}