LINUX.ORG.RU

[C++] Почему не работает самопальный str_replace


0

1

#include <iostream>

using namespace std;

string str_replace(string orig, string rep, string str){
   string tmp(str);
   for (int pos = tmp.find(orig); pos != tmp.rfind(orig); pos = tmp.find(orig, pos)){
      tmp = tmp.replace(pos, orig.length(), rep);
   }
   return tmp;
}

int main(int argc, char ** argv){
   cout << str_replace(«lll», «ll», «Helllo, str_replace!») << endl;   
   return 0;
};

Открой для себя передачу параметров по ссылкам.

По сабжу думать лень.

uGin ()
Ответ на: комментарий от encyrtid

И вот так уже работатьт переставло:

#include <iostream>

using namespace std;

string str_replace(string orig, string rep, string str){
   string tmp(str);
   for (int pos = tmp.find(orig); pos != string::npos; pos = tmp.find(orig, pos)){
      tmp = tmp.replace(pos, orig.length(), rep);
   }
   return tmp;
}

int main(int argc, char ** argv){
   cout << str_replace(«l», «ll», «Helo, str_replace!») << endl;   
   return 0;
};

startApp ()
Ответ на: комментарий от startApp

Такой костыль сойдет?

#include <iostream>

using namespace std;

string str_replace(string orig, string rep, string str){
   string tmp(str);
   for (int pos = tmp.find(orig); pos != string::npos; pos = tmp.find(orig, pos)){
      tmp = tmp.replace(pos, orig.length(), rep);
      pos += rep.length() - orig.length() + 1;
   }
   return tmp;
}

int main(int argc, char ** argv){
   cout << str_replace("l", "ll", "Helo, str_replace!") << endl;
   return 0;
};

uGin ()
Ответ на: комментарий от startApp

Естественно, у тебя получается бесконечный цикл в этом случае. И осиль LORCODE...

encyrtid ★★★★★ ()
Ответ на: комментарий от startApp

когда ты находишь l, ты вставляешь ll, и опять же находишь первую из этих двух.

вообще, надо даже как-то так:

pos += fabs(rep.length() - orig.length() + 1, 1);

uGin ()

по константным ссылкам передавай, нафиг зря копировать объекты?

Obey-Kun ★★★★★ ()
Ответ на: комментарий от encyrtid

Правильный ответ — не пилить самопал.

Deleted ()

А вот мой старый костыль.

void str_replace(char *orig, char *rep, char *str){
 char buffer[10240];
 char *p;
 while( (p = strstr(str, orig)))
 {
  strncpy(buffer, str, p - str);
  buffer[p - str] = '\0';
  sprintf(buffer + (p - str), "%s%s", rep, p + strlen(orig));
  strcpy(str, buffer);
 }
}

startApp ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.