0

私は次のコードを実行しています、これを読みました:

C++ 文字列のエスケープ

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

struct CharacterEscaper
{
    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("start\x0aend");
    boost::find_format_all(s, boost::token_finder(!boost::is_print()), CharacterEscaper());
    std::cout << s << std::endl;
    return 0;
}

私が得ている出力はこれです:

start\xffffffaend

私は次のことを期待していました:

start\x0aend

これを読んだ:

http://en.cppreference.com/w/cpp/language/escape

何が正しいですか?

4

2 に答える 2

1

ここに 2 つの問題があります。

  • エスケーパーは、intフォーマットする前に文字値を に変換します。これは、charが符号付きの場合、上記の値0x7fが符号拡張され、余分なfs が出力に含まれることを意味します。unsigned char最初に に変換し、次にunsignedまたはに変換することで修正できますint。(2 番目の変換が必要かどうかを知るには、Boost フォーマッタについて十分に知りません。)
  • 16 進数のエスケープ シーケンスには、見つけられる限り多くの 16 進数が含まれるため、この場合は\x0ae. これを修正する 1 つの方法は、文字列リテラルを 2 つに分割することです。これらはコンパイル中に再結合されます。"start\x0a" "end"
于 2012-12-14T15:06:13.670 に答える
0

私は答えを持っていると思います。私はこれを書くべきだった:"start\x0a" "end"

于 2012-12-14T14:31:57.743 に答える