如何在运行时将字符串转换为其引号版本?
How can I convert a string to a quoted version of itself at runtime?
在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();
}
如果您需要转义'?'
以避免三重字符,则可能需要扩展此函数
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何在C++中将 Python 字符串转换为其转义版本?
- 将编译时常量向量转换为堆分配版本
- C++14 强制转换以返回成员函数的类型 - 简洁版本
- 是否有范围::视图::转换的可修改视图版本
- 如何将VDT的Pade Exp fast_ex()的双重版本的标量代码转换为SSE2?
- 标准::转换的功能版本
- Python 3.3 如何将这个递归函数转换为纯收益循环版本?
- 以具有多个点(版本号)的格式将数字强制转换(转换)为字符串
- 必须执行哪些操作才能将程序转换为强大的 OpenMP 感知版本
- C++——在类的不同模板版本之间进行强制转换的方法
- 正在将asio read_some转换为异步版本
- 将qt版本从5.1.1转换为5.3时,找不到.sys文件
- 如何在运行时将字符串转换为其引号版本?
- c++将.rc中的版本转换为代码
- C++:如何将%USERPROFILE%路径转换为文件路径(应该适用于Windows XP及更高版本)