0

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

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

我是否必须为此编写自己的函数?我怀疑我有。

提前感谢您的回答。

4

2 回答 2

3

在 C++11 之前的 C++ 中,您需要自己执行此操作。在 C++11 中,有一种“原始字符串”类型可以保留所有内容。参见例如:https ://en.wikipedia.org/wiki/C%2B%2B11

原始字符串由 <delim> 表示,R"<delim>(<text>)<delim>"其中 <delim> 可以是最多 16 个字符的字符串序列(包括空字符串)。请注意,<delim> 中的字符有一些限制,但这应该不是问题,因为无论如何您都希望它可读。

所以你的例子是:

char const* str = R"(hello\tworld\n)";
于 2012-09-16T20:03:06.673 回答
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();
}
于 2013-03-01T04:31:28.780 回答