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 /“ ... 我无法重新格式化该文件。
答案 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终止的字符串!