如何在字符串中的每个字符后添加反斜杠?

How do I add a backslash after every character in a string?

本文关键字:添加 字符 字符串      更新时间:2023-10-16

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

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

指南和代码示例将非常感谢。

我正在使用c++和VS2012。

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

在填充字符串时,不能以正常方式键入这些不可打印字符中的任何一个。例如,如果你想要一个包含"foo",然后是制表符,然后是"bar"的字符串,你不能通过输入

来创建它:

foo TAB bar

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

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

字符本身不是一个不可打印的字符,但是c++(和C)认为它是特殊的——它总是表示转义序列的开始。要在字符串中包含字符"",必须使用\对其本身进行转义。

在c++中如果你想要一个包含:

的字符串

c: windows foo 酒吧

使用转义序列来编码:

string s = "c:\windows\foo\bar"

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

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

但是要注意,有些api使用而有些使用/,所以您需要检查在哪些情况下使用此替换

如果您确实想用两个反斜杠替换每一个正斜杠的出现,那么这个应该可以完成工作:

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);
}
编辑:

注:如果我误解了这个问题,你的意图实际上是用一个反斜杠替换每一个正斜杠的出现,那么有一个更简单和更有效的解决方案(正如@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 == '/'); }, '');