【问题标题】:C++ Escape occurrences of \ in a stringC ++转义字符串中出现的\
【发布时间】:2018-03-22 10:36:52
【问题描述】:

有没有一种简单的方法来转义字符串中所有出现的\?我从以下字符串开始:

#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}")。但是,我还没有找到一种适用于未知(错误)转义序列的方法。

【问题讨论】:

  • 你展示一个文件样本和你的解析代码怎么样?
  • 在每个斜线之前添加另一个 \ 并尝试
  • 要搜索特殊字符,请在它们前面加上\ ,例如\\ 。您不需要修改 source 数据。
  • 顺便说一句,您也不需要“转义”源数据。就这样很好。如果您尝试检查调试器中的字符,您会看到\ 字符显示为\\ 。只有源代码中的字符串文字才需要转义。如果你使用cout &lt;&lt; str,你会看到没有修改的原始字符串
  • 我不想接触解析代码。一个相关的问题是:有没有办法在字符串中搜索 any 转义字符?

标签: c++ string c++11


【解决方案1】:

您可以使用原始字符串文字。见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

【讨论】:

    【解决方案2】:

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

    为什么?因为编译器将\c 和\d 分别直接转换为c 和d,给你一个关于Unknown escape sequence \c 和Unknown escape sequence \d 的警告(\b 很好,因为它是一个有效的转义序列)。在您有机会使用它之前,这直接发生在字符串文字上。

    要看到这个,你可以编译成汇编器

    gcc -S main.cpp
    

    您会在汇编代码的某处找到以下行:

    .string "a\bcd"
    

    因此,您的问题要么出在解析函数中,要么您使用字符串文字进行试验,您应该改用原始字符串 R"(a\b\c\d)"。

    【讨论】:

      猜你喜欢
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      相关资源
      最近更新 更多