如何在运行时将字符串转换为自身的引用版本?

Chu*_*uck 2 c++ stdstring

给定C++中的标准字符串对象,其中包含转义序列,如何在运行时将其转换为自身的引用版本?

std::string str("Foo said, \"bar\"\n");
Run Code Online (Sandbox Code Playgroud)

鉴于上述情况,我想创建一个新字符串quoted,其中包含以下内容:

"\"Foo said, \\\"bar\\\"\\n\""
Run Code Online (Sandbox Code Playgroud)

这只是一个例子.我需要使用任意字符串执行此操作.

我是否只需要为每个可能的转义序列手动执行此操作?

use*_*267 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();
Run Code Online (Sandbox Code Playgroud)

  • 对此的支持非常稀缺. (3认同)

jxh*_*jxh 5

如果您正在处理字符串文字,则可以将其传递给宏并对其进行字符串化.

#define STRINGIFY(X) #X
std::string str(STRINGIFY("Foo said, \"bar\"\n"));
Run Code Online (Sandbox Code Playgroud)

如果您已经存储了一个字符串文本,并且您希望它的一个版本可以作为可以在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();
}
Run Code Online (Sandbox Code Playgroud)

如果需要转义'?'以避免三字母,则可能需要扩展此功能.