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

3

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

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

我尝试了以下代码:

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

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

我该如何将 \ 替换为 / 或者 \\

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


Jerry,感谢您指出缺乏用例。我已经更新了问题(请参见上文)。我正在使用字符串构建JSON对象,因此不替换反斜杠会导致无效的JSON对象。 - Karthik Krishnaswamy
3个回答

2
您尝试使用的 std::replace 调用是完全有效的,应该可以按照您的要求执行,因此结果字符串不包含任何斜杠的唯一原因是一开始没有任何类型的斜杠。我建议使用调试器来确定在整个生命周期中发生了什么。

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)

0

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

这是因为字符串或字符文字常量中的反斜杠由编译器在编译时处理。运行时不做任何操作。

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


实际上我正在使用这些内容来构建一个JSON对象。不做任何事情也不是选项,因为结果的JSON对象将会无效。 - Karthik Krishnaswamy
2
@KarthikKrishnaswamy 这就是为什么不仅要寻求有关您拥有的解决方案的帮助,而且要描述解决方案所针对的实际问题(也称为XY问题)的重要性。 - Some programmer dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接