在C ++中每N个字符插入一个字符,改变N字符

时间:2015-08-08 01:36:18

标签: c++ string

我正在尝试使用:

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++ ----&gt; i+=16但失败并使"sqdfqdfqwerqwer"成为"s|q"

有人能找到我的错误吗?

4 个答案:

答案 0 :(得分:3)

 for (int i = 1; i < s.size(); i+=16) { // tried i++ ----> i+=16

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

<强>首先

  

但失败并使"sqdfqdfqwerqwer"成为"s|q"

你正在从给定字符串的第一个位置(i=1)跳到第16个位置(i+=16)。当第二次位置在1+16位置时循环运行时。

所以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];
   }
  • 我们遍历字符串的所有字符

  • 检查我们是否处于要求的位置。有关Modulo运算符如何工作的更多信息。

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

现在我通过

DoesThisAnswerYourQuestion?ImGladItDid.IfNotITriedMybest:D

打印出来

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

答案 1 :(得分:1)

HTTP/1.1 100 Continue

答案 2 :(得分:1)

  

我试过改变i ++ ----&gt; i + = 16但是失败了   &#34; sqdfqdfqwerqwer&#34;成为&#34; s | q&#34;

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

@ kirbyfan64os建议进行修正。快乐的编码。

答案 3 :(得分:1)

走过,

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"