【问题标题】:Escape special characters in a std::string [closed]转义 std::string 中的特殊字符 [关闭]
【发布时间】:2018-07-21 16:35:15
【问题描述】:

我有一个 std::string 对象。上下文应该被传递给一个日志函数,该函数接受类似于printf 格式样式的参数。但是参数的存储是有限制的。参数只能使用几个字节。

字符串是从文件中读取的,除了它只包含可读字符之外,我无法做出任何假设。该函数将解释字符串并特别注意“%”字符。但由于这不是真正的格式字符串,我需要转义百分比字符。

编辑: log 函数在参数和能力大小上是有限的,所以不可能使用"%s" 作为格式字符串和字符串作为参数。因此我需要转换字符串。所以log("%s", foo.c_str())是不可能的。

如何复制std::string 中的所有百分号?

std::string foo = "got 7%\n";

foo 转义后应该是“got 7%%\n”。

【问题讨论】:

  • 有什么可以投反对票的 cmet 吗?
  • 您根本不需要转义字符串,因为您不应该将它作为格式字符串传递给开头。使用单独的格式字符串"%s",并将该字符串作为参数传入,例如:log("%s", foo.c_str())log("%.*s", foo.size(), foo.c_str())
  • getline() 函数不对它读取的字符执行任何处理,因此您不必转义任何内容。但你的问题还很不清楚。
  • @NeilButterworth 正如您在问题中可能已经读到的内容来自外部来源。所以你不应该假设读取功能,例如getline 将负责内容。
  • @RemyLebeau 特殊的日志功能有限的,可以和"%s"一起使用。

标签: c++ string stl


【解决方案1】:

如果函数是真正的 printf 样式函数,则不需要转义字符串。不要将字符串作为格式字符串传入,使用单独的格式字符串"%s"并将字符串作为其参数传入,例如:

log("%s", foo.c_str());

log("%.*s", foo.size(), foo.c_str());

如果这不是一个选项,那么您需要在循环中手动替换 % 字符,例如:

std::string::size_type i = foo.find('%');
while (i != std::string::npos)
{
    foo.replace(i, 1, "%%");
    i = foo.find('%', i+2);
}
log(foo.c_str());

【讨论】:

    【解决方案2】:

    切勿将非程序存储/生成的字符串作为格式字符串传递。

    而是将"%s" 作为格式字符串传递,并将要打印的字符串作为参数传递。

    【讨论】:

    • 如您所见,我 想要 在我的程序中构建 基于输入的格式字符串。如果我不经处理就通过这些字符串,我不会问。 "%s" 被排除在问题中是有原因的。
    【解决方案3】:

    我找到了一个看起来比 Remys 的好答案更优雅的解决方案。

    #include <string>
    #include <regex>
    #include <logutil.h>
    
    std::regex percent(L"%");
    
    std::string s;
    // ... get a line from file ...
    
    s = std::regex_replace(s, percent, L"%%");
    log(s.c_str());
    

    我没有检查性能,因为这在我的用例中并不重要。

    【讨论】:

      猜你喜欢
      • 2014-09-25
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多