在C++中,在字符串中每N个字符插入一个字符并更改N个字符。

3

我正在尝试使用:

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();
}

来自 (如何在C++中将字符插入到字符串的每N个字符),但是更改了插入的"|",从每个字符变为每16个字符。

我尝试将i++更改为i+=16,但这会导致"sqdfqdfqwerqwer"变为"s|q"

有人能找出我的错误吗?


你是for循环的新手吗? - Drew Dormann
是的,我几天前刚开始学习 C++。 - John Down
4个回答

3
 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+16个位置。

所以,ss获取的是字符串s[0],s[i],s[i+16],s[2i+16]...,这就是你得到的字符串被剥离的版本。

解决方案已经在上面简要介绍过了,非常简单。

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


1
我尝试将i ++ ----> i + = 16进行更改,但失败了,使“sqdfqdfqwerqwer”变成“s | q”。 错误在于您增加了16。 您将第一个字符放入流中。 然后,您循环一次并将|和下一个字符放入流中。 然后,您增加16,这导致i大于字符串的大小。 因此,循环退出并打印出所提到的结果。 @ kirbyfan64os建议更正。 开心编码。

1
for (int i = 1; i < s.size(); i++) {
     if (i%16==0) ss << '|';
     ss << s[i];
   }

1
你能解释一下错误是什么吗?我想问题就是在问这个。 - Drew Dormann

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 

就像楼主所指出的一样。

好的。上次搞砸了,所以重新来过。可以通过连接字符串来完成,但是stringstream可能是更快的选择。不过,我需要进行性能测试来证明这一点。我还对代码进行了快速调整,允许调用者指定长度。这对于测试很有用,因此我保留了它。

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"

你提出的解决方案是覆盖字符而不是在字符之间插入。 - NathanOliver
花了一点时间,但这次我确保了。实际上,有一件事我不确定是插入在前面还是后面。我选择了后面。 - user4581301

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接