如何在C ++中打印原始的std :: string / c样式字符串

时间:2018-07-23 15:56:15

标签: c++

string str = "hello/nblabla/nblabla";
cout << str << endl;

如何使该程序的输出为: 你好/ nblabla / nblabla,如果我不能使用//并且通常不知道包含什么字符串。我也想对c样式的char字符串做同样的事情,如果/ 0出现在c样式的字符串中间,则需要打印/ 0。

我有类似的代码:

fin >> str;
stuff_to_do(str);
cout << str << endl;

其中fin是一个std :: ifstream到包含如下数据的文件的:123 / nb / t / 0/1 /“ ... 我无法重新格式化该文件。

2 个答案:

答案 0 :(得分:1)

我认为您需要一个转义函数,该转义函数接受任意文本并将其转义,以便它使用C ++字符串文字的语法(减去引号)。也许环顾四周,看看是否已经有图书馆在这么做。

由于存在多种逃脱字符的方法,因此存在一些约定。

我不喜欢此代码,但这是我快速汇总的 实施示例:

#include <string>
#include <iostream>
#include <sstream>
#include <iomanip>

const char* staticMap(char c) {
    switch (c) {
        case '\a': return "\\a";
        case '\b': return "\\b";
        case '\t': return "\\t";
        case '\n': return "\\n";
        case '\v': return "\\v";
        case '\f': return "\\f";
        case '\r': return "\\r";

        case '\"': return "\\\"";
        case '\'': return "\\\'";
        case '\?': return "\\\?";
        case '\\': return "\\\\";
    }
    return nullptr;
}

std::string escape_cpp(const std::string& input) {
    std::stringstream ss;
    for (char c : input) {
        const char* str = staticMap(c);
        if (str) { 
            ss << str;
        } else if (!isprint(static_cast<unsigned char>(c))) {
            ss << "\\u" << std::hex << std::setfill('0') << std::setw(4) << (static_cast<unsigned int>(static_cast<unsigned char>(c)));
        } else {
            ss << c;
        }
    }
    return ss.str();
}

int main() {

    std::string foo("bu\u00ffffalo\n\"\tw\u0000rld\"", 17);
    // Will be printed as written (by convention).
    std::cout << escape_cpp(foo) << std::endl;
}

答案 1 :(得分:1)

使用原始字符串文字。

string str = R"(hello\nblabla\nblabla)";
cout << str << endl;

输出: hello\nblabla\nblabla
这也适用于以null终止的字符串!