-2

我需要将文字文件路径 (C:/example.txt) 转换为与各种 WinAPI 注册表函数 (C://example.txt) 兼容的文件路径,但我不知道如何去做。

我已将其分解为必须在某个字符之后添加反斜杠(在本例中为 / ),但在那之后我完全被卡住了。

指导和代码示例将不胜感激。

我正在使用 C++ 和 VS2012。

4

3 回答 3

1

\\ 不是两个字符,是一个字符:

for(size_t i = 0, sz = sPath.size() ; i < sz ; i++)
    if(sPath[i]=='/')  sPath[i] = '\\';

但请注意,有些 API 与 \ 一起使用,而有些与 / 一起使用,因此您需要检查在哪些情况下使用此替换。

于 2013-01-02T20:00:37.683 回答
1

在 C++ 中,字符串由单个字符组成,例如"foo". 字符串可以由可打印字符(如字母表中的字母)或不可打印字符(如回车键或其他控制字符)组成。

在填充字符串时,您不能以正常方式键入这些不可打印字符之一。例如,如果您想要一个包含“foo”、然后是制表符、然后是“bar”的字符串,则不能通过键入以下内容来创建它:

fooTABbar

因为这只会插入那么多空格——它实际上不会插入TAB字符。

您可以通过“转义”它们来指定这些不可打印的字符。这是通过插入反斜杠字符 ( \) 后跟字符代码来完成的。在上面的字符串TAB由转义序列表示的情况下\t,你可以写:"foo\tbar"

该字符\本身不是不可打印的字符,但 C++(和 C)认为它是特殊的——它总是表示转义序列的开始。要在字符串中包含字符“\”,它本身必须被转义,使用\\.

因此,在 C++ 中,如果您想要一个包含以下内容的字符串:

c:\windows\foo\bar

您使用转义序列对此进行编码:

string s = "c:\\windows\\foo\\bar"
于 2013-01-02T20:11:56.040 回答
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);
}

编辑:

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 == '/'); }, '\\');
于 2013-01-02T20:12:48.807 回答