将双反斜杠替换为Wchar_t

Replacing Double Backslashes for Wchar_t

本文关键字:Wchar 替换      更新时间:2023-10-16

我将以下字符串作为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)";