C ++在字符串中转义\出现\

时间:2018-03-22 10:36:53

标签: c++ string c++11

是否有一种简单的方法来逃避字符串中\的所有出现?我从以下字符串开始:

#include <string>
#include <iostream>

std::string escapeSlashes(std::string str) {
    // I have no idea what to do here
    return str;
}

int main () {
    std::string str = "a\b\c\d";

    std::cout << escapeSlashes(str) << "\n";
    // Desired output:
    // a\\b\\c\\d

    return 0;
}

基本上,我正在寻找与this问题相反的问题。问题是我无法在字符串中搜索\,因为C ++已将其视为转义序列。

注意: 我无法在第一时间更改字符串str。它是从LaTeX文件解析的。因此,this对类似问题的回答不适用。 编辑:由于无关的问题,解析失败,此处的问题是关于字符串文字。

编辑:有很好的解决方案可以找到并替换已知的转义序列,例如this answer。另一种选择是使用boost::regex("\p{cntrl}")。但是,我还没有找到一个适用于未知(错误)转义序列的文件。

2 个答案:

答案 0 :(得分:6)

您可以使用原始字符串文字。见http://en.cppreference.com/w/cpp/language/string_literal

#include <string>
#include <iostream>

int main() {
    std::string str = R"(a\b\c\d)";

    std::cout << str << "\n";
    return 0;
}

输出:

a\b\c\d

答案 1 :(得分:1)

无法将字符串文字a\b\c\d转换为a\\b\\c\\d,即转义反斜杠。

为什么呢?由于编译器分别将\c\d直接转换为cd,因此会向您发出有关Unknown escape sequence \cUnknown escape sequence \d({{ 1}}很好,因为它是一个有效的转义序列)。在你有机会使用它之前,这直接发生在字符串文字上。

要看到这一点,你可以编译成汇编程序

\b

您将在汇编程序代码中的某处找到以下行:

gcc -S main.cpp

因此,您的问题是在解析函数中,或者您使用字符串文字进行试验,而您应该使用原始字符串.string "a\bcd"