如何在C++中的字符串中每N个字符插入一个字符

How to insert a character every N characters in a string in C++

如何将 character 插入 string 恰好在 1 个字符之后?

我需要插入'|'进入 每隔一个字符后的字符串。

换句话说(C++):"Tokens all around!"
变成:"T|o|k|e|n|s| |a|l|l| |a|r|o|u|n|d|!"(不,那不是数组)

谢谢

std::string tokenize(const std::string& s) {
   if (!s.size()) {
     return "";
   }
   std::stringstream ss;
   ss << s[0];
   for (int i = 1; i < s.size(); i++) {
     ss << '|' << s[i];
   }
   return ss.str();
}

您可以使用

string& insert (size_t pos, const string& str);

您必须遍历字符串,每次插入一个字符。

for (int i = 1; i < str.size(); i++) {
      str << str.insert(i, '|');
      i++;
}

我想我会使用标准算法和迭代器:

std::string add_seps(std::string const &input, std::string sep="|") { 
    std::ostringstream os;
    std::copy(input.begin(), input.end(), std::ostream_iterator<char>(os, sep));
    return os.str();
}

就目前而言,这会在输入的最后一个字符之后添加一个分隔符。如果你只想在字符之间使用它们,你可以使用 infix_ostream_iterator.

这里有一个略有不同的方法,它只会对结果字符串进行 1 次分配,因此它应该比其他一些建议更有效。

std::string AddSeparators(const std::string & s)
{
    if(s.size() <= 1)
        return s;

    std::string r;
    r.reserve((s.size()*2)-1);
    r.push_back(s[0]);
    for(size_t i = 1; i < s.size(); ++i)
    {
        r.push_back('|');
        r.push_back(s[i]);
    }
    return r;
}

这是我的 C++11 示例(使用 gcc 4.7):

#include <string>
#include <iostream>

template<const unsigned num, const char separator>
void separate(std::string & input)
{
    for ( auto it = input.begin(); (num+1) <= std::distance(it, input.end()); ++it )
    {
        std::advance(it,num);
        it = input.insert(it,separator);
    }
}

int main(void)
{
    std::string input{"aaffbb3322ff77c"};
    separate<3,' '>(input);
    std::cout << input << std::endl;
    separate<4,'+'>(input);
    std::cout << input << std::endl;
    return 0;
}

结果输出为:

aaf fbb 332 2ff 77c

aaf +fbb +332 +2ff +77c