替换Wchar_t的双反斜杠

时间:2016-03-18 18:49:08

标签: c++ windows

我将以下字符串作为JSON发送到我的程序作为管道标准输入。

{"file":"C:\\Windows\\System32"}

我尝试解析JSON,最后wchar_t* filePath变量得到双重反斜杠。实际上这是因为JSON。

现在我必须删除那些双反斜杠并替换为单反斜杠以将另一个程序作为CreateProces参数传递。

3 个答案:

答案 0 :(得分:2)

如果您的程序读取字符串"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;
}

(这可以更有效地完成,但会更复杂)。

答案 1 :(得分:1)

你在这里的实际上是单反斜杠。 '\'是一个特殊字符,用于“转义”跟随它的字符。当您在源代码中看到“\\”时,您的程序实际上会在该位置包含“\”。

对于对比和比较,请考虑“\ 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 *。你必须将你的起始字符串复制到其中。

答案 2 :(得分:0)

在C ++ 11中,您可以使用原始字符串文字来执行此操作:

wchar_t* filePath = LR"(C:\\Windows\\System32)";