为附加到字符串的每个项添加空格字符 - 必须删除最后一项。如何提高

时间:2013-09-19 11:48:04

标签: c++ string vector

这个函数,vec2string采用char的向量并转换为十六进制字符串表示,但每个字节值之间有一个空格。只是我的应用程序中的格式要求。任何人都可以想到一种方法来消除它的需要。

std::string& vec2string(const std::vector<char>& vec, std::string& s) {
   static const char hex_lookup[] = "0123456789ABCDEF";
   for(std::vector<char>::const_iterator it = vec.begin(); it != vec.end(); ++it) {
      s.append(1, hex_lookup[(*it >> 4) & 0xf]);
      s.append(1, hex_lookup[*it & 0xf]);    
      s.append(1, ' ');
   }
   //remove very last space - I would ideally like to remove this***
   if(!s.empty())
      s.erase(s.size()-1);

   return s;
}

5 个答案:

答案 0 :(得分:0)

如果字符串不为空,则可以在循环中添加一个检查,然后添加一个空格。像:

for (...)
{
    if (!s.empty())
        s += ' ';
    ...
}

答案 1 :(得分:0)

std::string& vec2string(const std::vector<char>& vec, std::string& s) {
   static const char hex_lookup[] = "0123456789ABCDEF";
   if (vec.empty())
      return s;
   s.reserve(s.size() + vec.size() * 3 - 1);
   std::vector<char>::const_iterator it = vec.begin();
   s.append(1, hex_lookup[(*it >> 4) & 0xf]);
   s.append(1, hex_lookup[*it & 0xf]);    
   for(++it; it != vec.end(); ++it) {
      s.append(1, ' ');
      s.append(1, hex_lookup[(*it >> 4) & 0xf]);
      s.append(1, hex_lookup[*it & 0xf]);    
   }
   return s;
}

答案 2 :(得分:0)

我首先将十六进制转换分成它自己的小函数:

std::string to_hex(char in) { 
    static const char hex_lookup[] = "0123456789ABCDEF";
    std::string s;
    s.push_back(hex_lookup[(in>>4) & 0xf];
    s.push_back(hex_lookup[in & 0xf];
    return s;
}

然后我会使用std::transform将其应用于整个矢量,并使用infix_ostream_iteratorstd::stringstream将这些片段组合在一起。

#include <sstream>
#include <algorithm>
#include "infix_iterator"

std::string vec2string(const std::vector<char>& vec) {
    std::stringstream s;

    std::transform(vec.begin(), vec.end(), 
                   infix_ostream_iterator<std::string>(s, " "), 
                   to_hex);
    return s.str();
}

另请注意,这不是修改现有字符串,而是创建并返回一个新字符串。至少在我看来,修改现有的字符串是一个糟糕的想法 - 简单地生成一个字符串更清晰,更模块化。如果调用者想要将结果组合成一个更长的字符串,那很好,但是对于较低级别的函数来说,最好只做一件事,并让更高级别的函数决定如何处理结果。

答案 3 :(得分:0)

如果你有Boost,请使用algorithm / string / join.hpp。否则,您可以尝试Duff的设备方法:

string hex_str(const vector<char>& bytes)
{
    string result;
    if (!bytes.empty())
    {
        const char hex_lookup[] = "0123456789ABCDEF";
        vector<char>::const_iterator it = bytes.begin();
        goto skip;
        do {
            result += ' ';
        skip:
            result += hex_lookup[(*it >> 4) & 0xf];
            result += hex_lookup[*it & 0xf];
        } while (++it != bytes.end());
    }
    return result;
}

答案 4 :(得分:0)

使用boost::trim documentation

boost::trim(your_string);