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

时间:2016-09-09 18:33:16

标签: c++ string escaping stdstring backslash

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

等路径

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

我试过

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

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

如何将\替换为/\\

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

3 个答案:

答案 0 :(得分:1)

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

这是因为在编译时,字符串或字符文字常量中的反斜杠由编译器处理。什么都没有在运行时完成。

因此,解决问题的方法实际上就是什么都不做。

答案 1 :(得分:1)

好的,所以这是转换为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)

答案 2 :(得分:0)

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

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