将双反斜杠替换为Wchar_t
Replacing Double Backslashes for Wchar_t
我将以下字符串作为JSON发送到我的程序作为管道标准。
{"file":"C:\Windows\System32"}
我尝试解析 JSON,最终wchar_t* filePath
变量被双斜杠。其实是因为JSON。
现在我必须删除这些双反斜杠并替换为单个反斜杠以将另一个程序作为参数传递CreateProces
。
如果您的程序"C:\Windows\System32"
读取字符串,那么它当然会有双反斜杠! 如果你在源代码中编写该字符串,那么它实际上不会有双反斜杠,因为在源代码中"\"
意味着一个反斜杠,但在从 stdin 或文件中读取输入时并非如此。但是,如果您使用正确的 JSON 解析器,那么它应该为您正确处理反斜杠,并返回一个带有单个反斜杠的字符串。
但是,如果在程序读取数据之前无法修复数据,则可以编写代码来删除重复项。
此函数将用单个字符替换字符串中相邻的重复字符:
std::string remove_dups(std::string s, char c)
{
char cc[3] = { c, c };
auto pos = s.find(cc);
while (pos != s.npos) {
s.erase(pos, 1);
pos = s.find(cc, pos+1);
}
return s;
}
然后像remove_dups(str, '')
一样调用它以删除''
(即反斜杠)字符的重复项。
您可以轻松地将其概括为也适用于宽字符串:
template<typename C>
std::basic_string<C> remove_dups(std::basic_string<C> s, C c)
{
C cc[3] = { c, c };
auto pos = s.find(cc);
while (pos != s.npos) {
s.erase(pos, 1);
pos = s.find(cc, pos+1);
}
return s;
}
std::wstring str = L"C:\\Windows\\System32";
str = remove_dups(str, L'');
const wchar_t* ws = str.c_str();
或者,如果您不介意将所有相邻的重复项替换为单个字符,则可以使用 std::unique
算法:
std::wstring str = L"C:\\Windows\\System32";
auto last = std::unique(str.begin(), str.end());
str.erase(last, str.end());
如果您从以 nul 结尾的 wchar_t*
变量开始,则可以使用此函数更新其内容,该函数使用上面的replace_dups
函数:
void remove_dups_inplace(wchar_t* ws) {
std::wstring str = ws;
str = remove_dups(str, L'');
auto len = str.copy(ws, str.length());
ws[len] = 0;
}
(这可以更有效地完成,但会更复杂)。
你在这里拥有的实际上是单个反斜杠。"\"是一个特殊字符,用于"转义"它后面的字符。当您在源代码中看到"\\"时,您的程序实际上会在该位置包含"\"。
为了进行对比和比较,请考虑"\r",它是C++中的单个回车符。
for(int i = 0; i < wcslen(text) - 1; ++i)
{
if (text[i] == '' && text[i + 1] == '')
{
wcscpy(text + i, text + i + 1);
}
}
上述假设text
是一个wchar_t*,指向包含要修改的文本的可变区域。您必须将起始字符串复制到其中。
在 C++11 中,您可以使用原始字符串文字执行此操作:
wchar_t* filePath = LR"(C:\Windows\System32)";
- 模板参数替换失败,并且未完成隐式转换
- 如何用转义符替换字符串中的所有特殊字符
- MacOS通过在莫哈韦"wchar.h"下破碎的自制啤酒发出叮当声
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 在一个读写器队列中,我可以用volatile替换原子吗
- 用符号版本替换对函数的所有调用
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 替换基于地图的所有引用
- 按平均值替换数组中的元素
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 初始化 std::vector 替换为单大括号而不是双大括号
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- 删除/替换C++字符串中的多字符 (ÿû)
- 将 malloc 替换为数组
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 如何在C++中用'\'替换''来处理转义序列?
- 替换密码:哪一个?
- 替换 C++17 中移除的绑定 1st
- 用通用的东西替换WCHAR和wchar_t