如何replacestring中的所有字符?

std::string另一个字符replace所有出现的字符的有效方法是什么?

std::string不包含这样的函数,但是可以使用algorithm头的独立replace函数。

 #include <algorithm> #include <string> void some_func() { std::string s = "example string"; std::replace( s.begin(), s.end(), 'x', 'y'); // replace all 'x' to 'y' } 

我以为我也会在推动解决scheme中抛弃:

 #include <boost/algorithm/string/replace.hpp> // in place std::string in_place = "blah#blah"; boost::replace_all(in_place, "#", "@"); // copy const std::string input = "blah#blah"; std::string output = boost::replace_all_copy(input, "#", "@"); 

这个问题是以characterreplace为中心的,但是,当我发现这个页面非常有用的时候(特别是Konrad的评论),我想分享一下这个更通用的实现,它允许处理substrings

 std::string ReplaceAll(std::string str, const std::string& from, const std::string& to) { size_t start_pos = 0; while((start_pos = str.find(from, start_pos)) != std::string::npos) { str.replace(start_pos, from.length(), to); start_pos += to.length(); // Handles case where 'to' is a substring of 'from' } return str; } 

用法:

 std::cout << ReplaceAll(string("Number Of Beans"), std::string(" "), std::string("_")) << std::endl; std::cout << ReplaceAll(string("ghghjghugtghty"), std::string("gh"), std::string("X")) << std::endl; std::cout << ReplaceAll(string("ghghjghugtghty"), std::string("gh"), std::string("h")) << std::endl; 

输出:

Number_Of_Beans

XXjXugtXty

hhjhugthty


编辑:

上面的代码可以用更合适的方式实现,如果你担心性能问题,可以通过返回nothing( void )并直接对作为参数给定的stringstr执行更改,而不是通过地址传递。 这样可以避免原始string的无用和昂贵的副本,同时返回结果。 你的电话,然后…

代码:

 static inline void ReplaceAll2(std::string &str, const std::string& from, const std::string& to) { // Same inner code... // No return statement } 

希望这会对其他人有所帮助

想象一下,由于传输协议不允许有\ 0字节,因此所有的0x00字节都应该被“\ 1 \ x30”替代,而所有的0x01字节被“\ 1 \ x31”replace。

在以下情况下:

  • replace和replace的string有不同的长度,
  • 在源string中有许多待replacestring的出现
  • 源string很大,

所提供的解决scheme不能被应用(因为它们只replace单个字符)或者具有性能问题,因为它们会多次调用string :: replace,从而产生blob大小的副本。 (我不知道助推解决scheme,也许从这个angular度来看)

这个源文件中的所有事件都是沿着一条一条一条地build立起来的:

 void replaceAll(std::string& source, const std::string& from, const std::string& to) { std::string newString; newString.reserve(source.length()); // avoids a few memory allocations std::string::size_type lastPos = 0; std::string::size_type findPos; while(std::string::npos != (findPos = source.find(from, lastPos))) { newString.append(source, lastPos, findPos - lastPos); newString += to; lastPos = findPos + from.length(); } // Care for the rest after last occurrence newString += source.substr(lastPos); source.swap(newString); } 

一个简单的查找和replace单个字符将会像这样:

s.replace(s.find("x"), 1, "y")

为了完成整个string,最简单的方法就是循环直到你的s.find开始返回npos 。 我想你也可以捕捉range_error退出循环,但这是一个有点丑陋。

正如Kirill所build议的那样,可以使用replace方法,也可以沿着string逐个replace每个字符。

或者,您可以使用find方法或find_first_of具体取决于您需要执行的操作。 这些解决scheme都不能一次完成这项工作,但是只需要添加几行代码就可以使它们适用于您。 🙂

 #include <iostream> #include <string> using namespace std; // Replace function.. string replace(string word, string target, string replacement){ int len, loop=0; string nword="", let; len=word.length(); len--; while(loop<=len){ let=word.substr(loop, 1); if(let==target){ nword=nword+replacement; }else{ nword=nword+let; } loop++; } return nword; } //Main.. int main() { string word; cout<<"Enter Word: "; cin>>word; cout<<replace(word, "x", "y")<<endl; return 0; } 

如果你想要replace多个单个字符,并且只处理std::string ,那么这个片段就可以工作,用sReplacereplacesHaystack中的sNeedle,并且sNeedle和sReplace不需要是相同的大小。 这个例程使用while循环来replace所有的事件,而不是从左到右find第一个。

 while(sHaystack.find(sNeedle) != std::string::npos) { sHaystack.replace(sHaystack.find(sNeedle),sNeedle.size(),sReplace); } 

这工作! 我使用类似于此的书店应用程序,库存存储在CSV(如.dat文件)中。 但是在单个字符的情况下,这意味着replace者只是一个字符,例如'|',它必须用双引号“|” 为了不抛出无效的转换const char。

 #include <iostream> #include <string> using namespace std; int main() { int count = 0; // for the number of occurences. // final hold variable of corrected word up to the npos=j string holdWord = ""; // a temp var in order to replace 0 to new npos string holdTemp = ""; // a csv for a an entry in a book store string holdLetter = "Big Java 7th Ed,Horstman,978-1118431115,99.85"; // j = npos for (int j = 0; j < holdLetter.length(); j++) { if (holdLetter[j] == ',') { if ( count == 0 ) { holdWord = holdLetter.replace(j, 1, " | "); } else { string holdTemp1 = holdLetter.replace(j, 1, " | "); // since replacement is three positions in length, // must replace new replacement's 0 to npos-3, with // the 0 to npos - 3 of the old replacement holdTemp = holdTemp1.replace(0, j-3, holdWord, 0, j-3); holdWord = ""; holdWord = holdTemp; } holdTemp = ""; count++; } } cout << holdWord << endl; return 0; } // result: Big Java 7th Ed | Horstman | 978-1118431115 | 99.85 

目前我很less使用CentOS,所以我的编译器版本如下。 C ++版本(g ++),C ++ 98默认:

 g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4) Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

如果你愿意使用std::string s,你可以直接使用这个sample-app的strsub函数,或者如果你希望它采用不同的types或参数集来实现大致相同的目标,可以使用它。 基本上,它使用std::string的属性和function快速擦除匹配的字符集,并直接在std::string插入所需的字符。 每次它执行这个replace操作时,如果它仍然可以find要replace的匹配字符,则会更新偏移量,如果它不能替代,则返回最后一次更新时的状态string。

 #include <iostream> #include <string> std::string strsub(std::string stringToModify, std::string charsToReplace, std::string replacementChars); int main() { std::string silly_typos = "annoiiyyyng syyyllii tiipos."; std::cout << "Look at these " << silly_typos << std::endl; silly_typos = strsub(silly_typos, "yyy", "i"); std::cout << "After a little elbow-grease, a few less " << silly_typos << std::endl; silly_typos = strsub(silly_typos, "ii", "y"); std::cout << "There, no more " << silly_typos << std::endl; return 0; } std::string strsub(std::string stringToModify, std::string charsToReplace, std::string replacementChars) { std::string this_string = stringToModify; std::size_t this_occurrence = this_string.find(charsToReplace); while (this_occurrence != std::string::npos) { this_string.erase(this_occurrence, charsToReplace.size()); this_string.insert(this_occurrence, replacementChars); this_occurrence = this_string.find(charsToReplace, this_occurrence + replacementChars.size()); } return this_string; } 

如果你不想依赖std::string s作为你的参数,那么你可以传递C风格的string,你可以在下面看到更新后的样例:

 #include <iostream> #include <string> std::string strsub(const char * stringToModify, const char * charsToReplace, const char * replacementChars, uint64_t sizeOfCharsToReplace, uint64_t sizeOfReplacementChars); int main() { std::string silly_typos = "annoiiyyyng syyyllii tiipos."; std::cout << "Look at these " << silly_typos << std::endl; silly_typos = strsub(silly_typos.c_str(), "yyy", "i", 3, 1); std::cout << "After a little elbow-grease, a few less " << silly_typos << std::endl; silly_typos = strsub(silly_typos.c_str(), "ii", "y", 2, 1); std::cout << "There, no more " << silly_typos << std::endl; return 0; } std::string strsub(const char * stringToModify, const char * charsToReplace, const char * replacementChars, uint64_t sizeOfCharsToReplace, uint64_t sizeOfReplacementChars) { std::string this_string = stringToModify; std::size_t this_occurrence = this_string.find(charsToReplace); while (this_occurrence != std::string::npos) { this_string.erase(this_occurrence, sizeOfCharsToReplace); this_string.insert(this_occurrence, replacementChars); this_occurrence = this_string.find(charsToReplace, this_occurrence + sizeOfReplacementChars); } return this_string; }