以编程方式在C ++中获取转义字符串表示形式

时间:2012-09-16 18:56:14

标签: c++ string escaping

有时,我想获取字符串的转义字符串表示形式。在这种情况下,我想打印输出到控制台,但输出可以包括任何字符(制表符,NL,CR等),我宁愿输出这些的转义序列,使其更具可读性(并在一个线)。

例如escape("hello\tworld\n") == "hello\\tworld\\n"

我是否必须为此编写自己的功能?我怀疑我这样做。

提前感谢您的回答。

2 个答案:

答案 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();
}