C++ 字符串:如何替换未转义的反斜杠?

C++ string: How to replace unescaped backslash?

我正在阅读一些日志文件。 Windows 的日志包含类似 C:\some\path.

的路径

当我使用 std::getline 读取时,我得到一个包含未转义反斜杠的字符串。如何用正斜杠替换它们?

我试过了

std::replace(str.begin(), str.end(), '\', '/');

但结果看起来像 C:somepath 而不是 C:/some/path

如何将 \ 替换为 /\

此字符串随后用于构建 JSON 对象,因此不替换反斜杠会导致无效的 JSON 对象。

使用 '\n' 的换行符或反斜杠 '\' 等转义字符仅用于文字,即代码中的常量字符串和字符。在字符串或字符变量中,没有对反斜杠的特殊处理。

这是因为字符串或字符常量中的反斜杠在编译时由编译器处理。在 运行 时间没有做任何事情。

所以解决你的问题的办法就是什么都不做。

您尝试的 std::replace 调用是完全有效的,应该完全按照您的意愿执行,因此结果字符串不包含任何斜线的唯一原因是没有任何类型的斜线开始与.

我建议使用调试器来确定您的字符串在其整个生命周期中发生了什么

好的,所以这是为了转换为 JSON,其中需要以某种方式修改反斜杠(显然在这种情况下允许转换为正斜杠,否则您需要加倍反斜杠-斜杠以避开它们)。

您的基本想法应该可行——只需将每个 \ 替换为 / 就足够简单了。

#include <iostream>
#include <algorithm>
#include <string>
#include <cassert>

int main() { 
    std::string in{"a\b\c\d"};

    std::replace(in.begin(), in.end(), '\', '/');

    assert(in == "a/b/c/d");

    std::cout << in;
}

我不确定你遇到了什么问题——至少对我来说,这似乎工作正常。当然,这只有作为更大程序的一部分才真正有意义。如果您打算单独执行此操作,tr 就完全足够了。如果你真的需要把它变成一个程序,SNOBOL 比 C 或 C++ 更容易完成这项工作:

loop:    INPUT "\" = '/' . OUTPUT     : s(loop)