我需要将文字文件路径 (C:/example.txt) 转换为与各种 WinAPI 注册表函数 (C://example.txt) 兼容的文件路径,但我不知道如何去做。
我已将其分解为必须在某个字符之后添加反斜杠(在本例中为 / ),但在那之后我完全被卡住了。
指导和代码示例将不胜感激。
我正在使用 C++ 和 VS2012。
我需要将文字文件路径 (C:/example.txt) 转换为与各种 WinAPI 注册表函数 (C://example.txt) 兼容的文件路径,但我不知道如何去做。
我已将其分解为必须在某个字符之后添加反斜杠(在本例中为 / ),但在那之后我完全被卡住了。
指导和代码示例将不胜感激。
我正在使用 C++ 和 VS2012。
\\ 不是两个字符,是一个字符:
for(size_t i = 0, sz = sPath.size() ; i < sz ; i++)
if(sPath[i]=='/') sPath[i] = '\\';
但请注意,有些 API 与 \ 一起使用,而有些与 / 一起使用,因此您需要检查在哪些情况下使用此替换。
在 C++ 中,字符串由单个字符组成,例如"foo"
. 字符串可以由可打印字符(如字母表中的字母)或不可打印字符(如回车键或其他控制字符)组成。
在填充字符串时,您不能以正常方式键入这些不可打印字符之一。例如,如果您想要一个包含“foo”、然后是制表符、然后是“bar”的字符串,则不能通过键入以下内容来创建它:
foo
TABbar
因为这只会插入那么多空格——它实际上不会插入TAB字符。
您可以通过“转义”它们来指定这些不可打印的字符。这是通过插入反斜杠字符 ( \
) 后跟字符代码来完成的。在上面的字符串TAB由转义序列表示的情况下\t
,你可以写:"foo\tbar"
。
该字符\
本身不是不可打印的字符,但 C++(和 C)认为它是特殊的——它总是表示转义序列的开始。要在字符串中包含字符“\”,它本身必须被转义,使用\\
.
因此,在 C++ 中,如果您想要一个包含以下内容的字符串:
c:\windows\foo\bar
您使用转义序列对此进行编码:
string s = "c:\\windows\\foo\\bar"
如果用两个反斜杠替换每次出现的正斜杠确实是您想要的,那么这应该可以完成工作:
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);
}
编辑:
PS如果我误解了这个问题,而您的意图实际上是用一个反斜杠替换每次出现的正斜杠,那么有一个更简单、更有效的解决方案(正如@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 == '/'); }, '\\');