如何在运行时将字符串转换为其引号版本?

How can I convert a string to a quoted version of itself at runtime?

本文关键字:版本 转换 运行时 字符串      更新时间:2023-10-16

在c++中给定一个标准字符串对象,期望在其中有转义序列,我如何在运行时将其转换为引号版本?

std::string str("Foo said, "bar"n");
根据上面的内容,我想创建一个新的字符串quoted,它具有以下内容:
""Foo said, \"bar\"\n""

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

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

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();

如果处理的是字符串文字,可以通过宏传递并对其进行字符串化。

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

如果您需要转义'?'以避免三重字符,则可能需要扩展此函数