【问题标题】:Assigning const unsigned char* to a std::string performing in-place substitution or omission将 const unsigned char* 分配给执行就地替换或省略的 std::string
【发布时间】:2014-11-27 13:57:28
【问题描述】:

我有一个const unsigned char* bar,它是以空字符结尾的字符缓冲区。

我需要将此复制到std::string。目前我使用

std::string foo;
foo.assign(bar);

但是由于各种原因(由于bar),列表中出现了值> 127的奇数字符。用 32(空格)替换这些字符就足够了,最好完全省略它们。

有什么办法可以替换

  1. 在我复制到字符串之后。使用类似std::replace(foo.begin(), foo.end(), /*something funky*/)

  2. 在我执行assign 时使用某种谓词“后插入”。

我更喜欢第 (2) 行的内容。在我深入研究 for 循环之前,有没有更类似于 stl 的方法可以做到这一点?

【问题讨论】:

  • 也许你应该尝试了解文本是如何编码的
  • 它是 UTF-8,但我需要将它转换为 UTF-7 用于 LaTeX。奇怪的重音字符(可能 10000 分之一)回来了:我很高兴废弃边缘字符。
  • 使用 \usepackage[utf8]{inputenc} 并将 UTF-8 发送到 LaTeX stackoverflow.com/questions/1252998/…
  • 或者使用 xelatex,它接受 UTF-8 开箱即用

标签: c++


【解决方案1】:

如果您只想省略值 >= 128(或 < 0,如果 char 已签名),这样的方法应该可以解决问题:

std::copy_if(bar, bar + <length of string>,
    std::back_inserter(foo),
    [](char c) { return c < 128 && c >= 0;});

【讨论】:

    【解决方案2】:

    我更喜欢第 (2) 行的内容。在我深入研究 for 循环之前,有没有更类似于 stl 的方法可以做到这一点?

    考虑 std::transform 并将两个流(原始流和字符串流)视为迭代器序列:

    const unsigned char* bar = some_data();
    auto length = std::strlen(reinterpret_cast<const char*>(bar));
    const auto bar_end = bar + length;
    std::string foo{ length, ' ' }; // avoid reallocations in transform
    std::transform(bar, bar_end, foo.begin(), [](const unsigned char c) -> const char {
        return c > 127 ? ' ' : reinterpret_cast<const char>(c);
    });
    

    【讨论】:

      猜你喜欢
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 2013-07-18
      • 2020-11-04
      • 2021-07-18
      • 1970-01-01
      相关资源
      最近更新 更多