我需要将文字文件路径(C:/example.txt)转换为与各种WinAPI注册表函数(C://example.txt)兼容的文件路径,并且我不知道如何去做
我已将其分解为必须在某个字符后添加反斜杠(在这种情况下为/)但在此之后我完全陷入了困境。
非常感谢指导和代码示例。
我正在使用C ++和VS2012。
答案 0 :(得分:1)
\\不是两个字符,是一个字符:
for(size_t i = 0, sz = sPath.size() ; i < sz ; i++)
if(sPath[i]=='/') sPath[i] = '\\';
但请注意,某些API与\一起使用,而某些API使用/,因此您需要检查使用此替换的情况。
答案 1 :(得分:1)
在C ++中,字符串由单个字符组成,如"foo"
。字符串可以由可打印字符(如字母表中的字母)或不可打印字符(如输入键或其他控制字符)组成。
填充字符串时,不能以正常方式键入其中一个不可打印的字符。例如,如果您想要一个包含“foo”的字符串,然后是一个选项卡,然后是“bar”,则无法通过键入以下内容来创建:
foo
TAB bar
因为这只会插入那么多空格 - 它实际上不会插入 TAB 字符。
您可以通过“转义”它们来指定这些不可打印的字符。这是通过插入一个反斜杠字符(\
)后跟字符的代码来完成的。如果字符串 TAB 由转义序列\t
表示,那么您可以写:"foo\tbar"
。
字符\
本身不是不可打印的字符,但C ++(和C)认为它是特殊的 - 它总是表示转义序列的开头。要在字符串中包含字符“\”,必须使用\\
对其进行转义。
所以在C ++中,如果你想要一个包含:
的字符串C:\ WINDOWS \ FOO \杆
使用转义序列对此进行编码:
string s = "c:\\windows\\foo\\bar"
答案 2 :(得分:0)
如果用两个反斜杠替换每一个正斜杠都是你想要的,那么这应该可以胜任:
size_t i = str.find('/');
while (i != string::npos)
{
string part1 = str.substr(0, i);
string part2 = str.substr(i + 1);
str = part1 + R"(\\)" + part2; // Use "\\\\" instead of R"(\\)" if your compiler doesn't support C++11's raw string literals
i = str.find('/', i + 1);
}
修改强>
P.S。如果我误解了这个问题并且你的意图实际上是用一个反斜杠替换每一个正斜杠,那么就有一个更简单,更有效的解决方案(正如@RemyLebeau在评论中指出的那样):
size_t i = str.find('/');
while (i != string::npos)
{
str[i] = '\\';
i = str.find('/', i + 1);
}
或者,甚至更好:
std::replace_if(str.begin(), str.end(), [] (char c) { return (c == '/'); }, '\\');