我正在阅读一些日志文件。Windows的日志中包含C:somepath
等路径
当我用std::getline
读取时,我得到一个包含未转义反斜杠的字符串。我如何用正斜杠代替它们?
我试着
std::replace(str.begin(), str.end(), '\', '/');
,但结果看起来像C:somepath
而不是C:/some/path
。
如何用/
或\
替换 ?
这个字符串然后被用来构建一个JSON对象,所以不替换反斜杠会导致无效的JSON对象。
您尝试的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)
转义字符如换行使用'n'
或反斜杠如'\'
只用于字面量,即常量字符串和字符在你的代码。在字符串或字符变量中,没有对反斜杠的特殊处理。
这是因为字符串或字符常量中的反斜杠在编译时由编译器处理。在运行时什么也不做。
所以你的问题的解决方法就是什么都不做。