Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I replace all instances of a string with another string?

Tags:

c++

string

I found this on another stack question:

//http://stackoverflow.com/questions/3418231/c-replace-part-of-a-string-with-another-string // void 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) {         size_t end_pos = start_pos + from.length();         str.replace(start_pos, end_pos, to);         start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'     } } 

and my method:

string convert_FANN_array_to_binary(string fann_array) {     string result = fann_array;     cout << result << "\n";     replaceAll(result, "-1 ", "0");     cout << result << "\n";     replaceAll(result, "1 ", "1");     return result; } 

which, for this input:

cout << convert_FANN_array_to_binary("1 1 -1 -1 1 1 "); 

now, the output should be "110011"

here is the output of the method:

1 1 -1 -1 1 1  // original 1 1 0 1  // replacing -1's with 0's 11 1  // result, as it was returned from convert_FANN_array_to_binary() 

I've been looking at the replaceAll code, and, I'm really not sure why it is replacing consecutive -1's with one 0, and then not returning any 0's (and some 1's) in the final result. =\

like image 457
NullVoxPopuli Avatar asked Mar 17 '11 17:03

NullVoxPopuli


1 Answers

A complete code:

std::string ReplaceString(std::string subject, const std::string& search,                           const std::string& replace) {     size_t pos = 0;     while ((pos = subject.find(search, pos)) != std::string::npos) {          subject.replace(pos, search.length(), replace);          pos += replace.length();     }     return subject; } 

If you need performance, here is a more optimized function that modifies the input string, it does not create a copy of the string:

void ReplaceStringInPlace(std::string& subject, const std::string& search,                           const std::string& replace) {     size_t pos = 0;     while ((pos = subject.find(search, pos)) != std::string::npos) {          subject.replace(pos, search.length(), replace);          pos += replace.length();     } } 

Tests:

std::string input = "abc abc def"; std::cout << "Input string: " << input << std::endl;  std::cout << "ReplaceString() return value: "            << ReplaceString(input, "bc", "!!") << std::endl; std::cout << "ReplaceString() input string not changed: "            << input << std::endl;  ReplaceStringInPlace(input, "bc", "??"); std::cout << "ReplaceStringInPlace() input string modified: "            << input << std::endl; 

Output:

Input string: abc abc def ReplaceString() return value: a!! a!! def ReplaceString() input string not changed: abc abc def ReplaceStringInPlace() input string modified: a?? a?? def 
like image 97
Czarek Tomczak Avatar answered Sep 28 '22 12:09

Czarek Tomczak