如何在运行时将字符串转换为自身的引用版本? 在C++中给定一个标准字符串对象,它预期有转义序列,在运行时如何将其转换为自己的引用版本?< /P> std::string str("Foo said, \"bar\"\n");

如何在运行时将字符串转换为自身的引用版本? 在C++中给定一个标准字符串对象,它预期有转义序列,在运行时如何将其转换为自己的引用版本?< /P> std::string str("Foo said, \"bar\"\n");,c++,stdstring,C++,Stdstring,鉴于上述情况,我想创建一个新字符串,quoted,该字符串包含以下内容: "\"Foo said, \\\"bar\\\"\\n\"" 这只是一个例子。我需要使用任意字符串执行此操作 对于每个可能的转义序列,我都必须手动执行此操作吗?如果您处理的是字符串文字,则可以将其传递给宏并将其字符串化 #define STRINGIFY(X) #X std::string str(STRINGIFY("Foo said, \"bar\"\n")); 如果您已经存储了一个字符串文本,并且希望它的一个版本

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

"\"Foo said, \\\"bar\\\"\\n\""
这只是一个例子。我需要使用任意字符串执行此操作


对于每个可能的转义序列,我都必须手动执行此操作吗?

如果您处理的是字符串文字,则可以将其传递给宏并将其字符串化

#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();
}
std::字符串十六进制(int c){
std::ostringstream oss;
ossc++14有一个新的操纵器,例如

std::cout << quoted(str); // defaults to '"' as the quote and '\\' as the escape

std::ostringstream oss;
oss << quoted(str);
auto quoted_string = oss.str();

std::cout是的。虽然您只需要转义
`和
“`,但其余的只是为了更好的可读性。只需为您创建一个函数即可。将
\“
添加到开头并
\"
结束。您需要字符串可读吗?对每个字符进行转义可能比对所有实际需要转义的字符进行特殊处理更容易。使用Unicode表示法在技术上是正确的,尽管完全难以辨认。如果您愿意,Roger Pate的答案可能正是您想要的我们只是在处理ASCII文本……这是运行时转义还是编译时转义?如果您有选择,请选择后者。这些不是字符串文本,而是由用户提供的。这是说明性的,尽管您可以使用
str
by
const&
,但对于其他控制字符,最好使用八进制表示rs和IMGO
at()
对于这样一个可以非常经常调用的简单函数来说,这是一种过火的做法——不过,向需要在web上查找此函数的人展示这一点并不坏;-。@TonyD:字符串通常是引用计数的,并且在编写时进行复制,所以我通常不太担心它,但我已经按照您的建议进行了修复。@jxh:+1/interesting topic COW-我收集到它在标准库实现中的使用在过去几年中已被搁置……请参阅,例如,干杯。@TonyD:谢谢您提供的信息。对此的支持非常少。@0x499602D2在最新的稳定clang和GCC中受支持,MS将其包括在VS14 CTP1中。