【问题标题】:How to insert a character every N characters in a string in C++如何在C ++中的字符串中每N个字符插入一个字符
【发布时间】:2015-03-13 04:09:31
【问题描述】:

如何将 character 插入到 string 中,正好在 1 个字符之后?

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

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

谢谢

【问题讨论】:

  • id 创建一个两倍大小的新字符串。复制一个字符,插入 |,冲洗并重复。
  • @TheParamagneticCroissant 我正在制作一种无法编译的编程语言,但用户将能够使用它制作编译器,因为它是先进的。说:'它不会编译',我的意思是你在一个文件中编写一个程序并将它拖放到一个 exe 上,你会在 cmd 中看到输出。
  • @TheParamagneticCroissant 我做到了 :) 它转换为 C,然后使用 MinGW 处理其余部分。

标签: c++ string tokenize


【解决方案1】:
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();
}

【讨论】:

    【解决方案2】:

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

    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

    【讨论】:

    • 这是否回答了标题中的问题,每第 N 个字符?可以重写迭代器来处理它吗?
    • @Jonny:它在输入中的每个“项目”之后插入一个分隔符。因为事实证明他在每个字符之后都想要它,所以这只是使用了一个 char 类型的“项目”。如果你想要 2 个字符,然后是一个分隔符,你可以将两个字符串从输入复制到输出。
    【解决方案3】:

    这是我的 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

    【讨论】:

      【解决方案4】:

      你可以使用

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

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

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

      【讨论】:

      • 如果您能实际向我展示您将编写的代码,我将不胜感激。
      • @IdealHate 解决方案可能是最好的
      • @mgreenier 你投票了吗?因为这一切都涉及到人们投票不说。
      【解决方案5】:

      这是一种稍微不同的方法,它只会对结果字符串进行 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-06
        相关资源
        最近更新 更多