Выход из строки C++

Что является самым легким способом преобразовать станд. C++:: представьте в виде строки к другому станд.:: строка, из которой вышли все непечатные символы?

Например, для строки двух символов [0x61,0x01], строка результата могла бы быть "a\x01" или "a%01".

18
задан Danra 28 July 2015 в 09:24
поделиться

4 ответа

Взгляните на библиотеку строковых алгоритмов Boost . Вы можете использовать его классификатор is_print (вместе с его оператором! Overload), чтобы выбрать непечатаемые символы, а его функции find_format () могут заменить их с любым форматированием по вашему желанию.

#include <iostream>
#include <boost/format.hpp>
#include <boost/algorithm/string.hpp>

struct character_escaper
{
    template<typename FindResultT>
    std::string operator()(const FindResultT& Match) const
    {
        std::string s;
        for (typename FindResultT::const_iterator i = Match.begin();
             i != Match.end();
             i++) {
            s += str(boost::format("\\x%02x") % static_cast<int>(*i));
        }
        return s;
    }
};

int main (int argc, char **argv)
{
    std::string s("a\x01");
    boost::find_format_all(s, boost::token_finder(!boost::is_print()), character_escaper());
    std::cout << s << std::endl;
    return 0;
}
11
ответ дан 30 November 2019 в 08:03
поделиться

Предполагается, что набор символов выполнения является надмножеством ASCII и CHAR_BIT равен 8. Для OutIter передайте back_inserter (например, в вектор ). или другая строка), ostream_iterator или любой другой подходящий итератор вывода.

template<class OutIter>
OutIter write_escaped(std::string const& s, OutIter out) {
  *out++ = '"';
  for (std::string::const_iterator i = s.begin(), end = s.end(); i != end; ++i) {
    unsigned char c = *i;
    if (' ' <= c and c <= '~' and c != '\\' and c != '"') {
      *out++ = c;
    }
    else {
      *out++ = '\\';
      switch(c) {
      case '"':  *out++ = '"';  break;
      case '\\': *out++ = '\\'; break;
      case '\t': *out++ = 't';  break;
      case '\r': *out++ = 'r';  break;
      case '\n': *out++ = 'n';  break;
      default:
        char const* const hexdig = "0123456789ABCDEF";
        *out++ = 'x';
        *out++ = hexdig[c >> 4];
        *out++ = hexdig[c & 0xF];
      }
    }
  }
  *out++ = '"';
  return out;
}
9
ответ дан 30 November 2019 в 08:03
поделиться

Непечатаемый символ одного человека является многобайтовым символом другого. Поэтому вам нужно будет определить кодировку, прежде чем вы сможете решить, какие байты соответствуют каким символам, а какие из них не печатаются.

3
ответ дан 30 November 2019 в 08:03
поделиться

Вы видели статью о том, как Generate Escaped String Output Using Spirit.Karma?

2
ответ дан 30 November 2019 в 08:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: