小编典典

用一些字符串替换字符串中的char

algorithm

我想用字符串替换字符串中的字符。我可以就地进行吗?由于新字符串的长度大于原始字符串的长度,问题是我可以使用额外的缓冲区吗?例如

void replaceChar(std::string &input, std::string replacementString, char charToReplace)
{
//some code here. No additional buffer
}

void main(){

  std::string input = "I am posting a comment on LinkedIn";
  std::string replacementString = "pppp";
  char charToReplace = 'o';
  replaceChar(input, replacementString, charToReplace);
}

我只想要策略(算法)。如果设计算法时要记住某种语言,那将是很好的,一旦像c ++这样初始化字符串,该语言就不会动态地增加或减少字符串的长度


阅读 312

收藏
2020-07-28

共1个答案

小编典典

std::string有一个replace成员,但是它根据数字位置而不是字符串的先前内容工作。因此,通常必须将其与find成员组合成一个循环,如下所示:

std::string old("o");

int pos;

while ((pos = x.find(old)) != std::string::npos)
    x.replace(pos, old.length(), "pppp");

就我个人而言,我很少担心字符串的大小调整频率,但是,如果这是一个主要问题,您可以使用它std::count来查找old字符串的出现次数,乘以新旧字符串之间的大小差,以及用于std::string::reserve()保留足够的空间。但是请注意,这reserve是C
++ 11中添加的-较早的实现将没有它。

编辑:尽管它与您使用的字符串无关,如@ipc指出,但是如果替换字符串包含要替换的值的实例,则此操作将无法正常工作。如果需要处理,则需要在字符串中提供偏移量,以开始每个搜索:

int pos = 0;

while ((pos = x.find(old, pos)) != std::string::npos) {
    x.replace(pos, old.length(), rep);
    pos += rep.length();
}

或者,for在这种情况下,您可能更喜欢循环:

    std::string old("o");
    std::string rep("pop");

for (int pos=0; 
    (pos = x.find(old, pos)) != std::string::npos; 
    pos+=rep.length())
{
    x.replace(pos, old.length(), rep);
}
2020-07-28