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

这里有两个问题:

  • int转义符在格式化之前将字符值转换为。这意味着,如果char是有符号的,上面0x7f的值将被符号扩展,f在输出中给出额外的 s。您可以通过先转换为unsigned char,然后再转换为unsigned或来解决此问题int。(我对 Boost 格式化程序知之甚少,不知道是否需要进行第二次转换。)
  • 十六进制转义序列将包含尽可能多的十六进制数字,因此在这种情况下它将是\x0ae. 解决此问题的一种方法是将字符串文字分成两部分,它们将在编译期间重新组合:"start\x0a" "end"
于 2012-12-14T15:06:13.670 回答
0

我想我有答案。我应该这样写:"start\x0a" "end"

于 2012-12-14T14:31:57.743 回答