【问题标题】:Insert a character every N characters in a string in C++ changing N character在C ++中的字符串中每N个字符插入一个字符,改变N个字符
【发布时间】:2015-08-08 01:36:18
【问题描述】:

我正在尝试使用:

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++) { // tried i++ ----> i+=16
     ss << '|' << s[i];
   }
   return ss.str();
}

来自 (How to insert a character every N characters in a string in C++),但将插入的 "|" 从每个字符更改为每 16 个字符。

我尝试更改 i++ ----> i+=16 但这失败了并且使 "sqdfqdfqwerqwer" 变为 "s|q"

有人能找出我的错误吗?

【问题讨论】:

  • 您是 for 循环的新手吗?
  • 是的。几天前我刚开始使用 C++。

标签: c++ string


【解决方案1】:
 for (int i = 1; i < s.size(); i+=16) { // tried i++ ----> i+=16

     ss << '|' << s[i];
   }

首先:

但这失败了,使"sqdfqdfqwerqwer"变成"s|q"

您正在从给定字符串的第 1 位 (i=1) 直接跳到第 16 位 (i+=16)。即当循环第二次运行时,该位置位于 1+16th 位置。

所以ss 正在获取字符串s[0],s[i],s[i+16],s[2i+16]... 这就是为什么您要剥离字符串 s 的版本。

解决方案 很简单,上面已经回答了

for (int i = 1; i < s.size(); i++) {
     if (i%16==0) ss << '|'; <<-- this is the main concept you are missing
     ss << s[i];
   }
  • 我们遍历字符串的所有字符

  • 检查我们是否处于所需位置。了解更多信息以了解模运算符的工作原理。

  • 如果我们得到所需的职位,做你想做的事。

现在当我通过时

DoesThisAnswerYourQuestion?ImGladItDid.IfNotITriedMybest:D

打印出来

DoesThisAnswerYo|urQuestion?ImGla|dItDid.IfNotITri|edMybest:D

【讨论】:

    【解决方案2】:
    for (int i = 1; i < s.size(); i++) {
         if (i%16==0) ss << '|';
         ss << s[i];
       }
    

    【讨论】:

    • 你能解释一下错误是什么吗?我认为问题是这样问的。
    【解决方案3】:

    我尝试更改 i++ ----> i+=16 但失败并导致 “sqdfqdfqwerqwer”变成“s|q”

    错误是您增加了 16。您将第一个字符放入流中。然后循环一次并将| 和下一个字符放入流中。然后增加 16,这导致 i 大于字符串的大小。因此循环退出并打印出上述结果。

    @kirbyfan64os 建议进行更正。编码愉快。

    【讨论】:

      【解决方案4】:

      路过,

      ss << s[0];
      

      第一个字符进入输出流

      for (int i = 1; 
      

      从 1 开始

           i < s.size(); 
      

      并继续直到到达或通过字符串的末尾

           i++) 
      

      查看数组中的每个元素

          ss << '|' << s[i];
      

      放一个|并将当前字符放入输出流中。

      所以对于“ABC”,循环展开到:

      ss << A;      //ss << s[0];
      ss << | << B; //ss << '|' << s[1];
      ss << | << C; //ss << '|' << s[2];
      

      流内容为 A|B|C

      for (int i = 1; i < s.size(); i+=16)
      

      表示查看字符串中的第二个元素和之后的每 16 个元素。也就是说,s[1]、s[17]、s[33]、s[49]...

      所以对于“sqdfqdfqwerqwer”,您展开到:

      ss << s;      //ss << s[0];
      ss << | << q; //ss << '|' << s[1];
      

      而且字符串中只有 15 个字符,所以没有 17 个可以看。输出是:

      s|q 
      

      正如 OP 指出的那样。

      好的。上次搞砸了,所以要两个。这可以在没有字符串缓冲区的情况下通过连接字符串来完成,但字符串流可能是更快的选择。不过,我必须通过个人资料来证明这一点。我还进行了快速调整以允许调用者指定长度。它对测试很有用,所以我把它留在里面了。

      std::string tokenize(const std::string& s,
                           size_t where)
      {
          if (s.size() > 0)
          {
              std::stringstream temp;
              temp << s.substr(0,where);
              for (size_t loc = where; loc < s.size(); loc+=where)
              {
                  temp << '|' << s.substr(loc,where);
              }
              return temp.str();
          }
          return "";
      }        
      

      结果:

      In =  "I'm the very model of a modern major general" 
      Out = "I'm the very mod|el of a modern m|ajor general"
      

      【讨论】:

      • 您建议的解决方案是覆盖字符,而不是在字符之间插入它们。
      • 花了一点时间,但这次我确定了。实际上,我不知道的一件事是插入是在之前还是之后。后来去了。
      猜你喜欢
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      相关资源
      最近更新 更多