9sty/105
Podmienianie ciągów znaków w C++
Dzisiaj w C++ potrzebowałem zamienić określony ciąg znaków w stringu na inny. Niestety, w referencji klasy string nie znalazłem odpowiadającej mi funkcji. Nie miałem już ochoty szukać, więc napisałem własną. W sumie możemy wprowadzić 5 argumentów - ciąg do zamiany, ciąg na jaki będzie zamieniany, ciąg, w którym będziemy szukać, limit ilości zamian i offset dla przeszukiwanego ciągu.
Oto plik main.cpp z moją funkcją:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <iostream> #include <string> using namespace std; string zamien(string szukany, string zamien_na, string zdanie, int limit = 0, int offset = 0) { string str = zdanie.substr(offset, zdanie.size() - offset); // wczytanie ciągu z odpowiednim offsetem bool szukanie = true; // zmienna dla wielokrotnego przeszukiwania size_t found; // zmienna dla pozycji wyszukanego ciągu if (limit > 0) limit++; while (szukanie) { found = str.find(szukany); // wszytanie pozycji szukanego ciagu if (found == string::npos || limit == 1) szukanie = false; // jesli znaleziono juz wszystkie ciągi - nie kontunuuj wyszukiwania else str.replace(int(found), szukany.size(), zamien_na); // w przeciwnym razie zamieniaj limit--; // zmniejszenie ilosci ciagow do podmienienia } return zdanie.substr(0, offset) + str; // zwrócenie całego ciągu } int main() { cout << zamien("ala", "lol", "ala to ala alanowa", 1, 2); // przykład użycia return 0; } |
Wszystko opisane w komentarzach. Proszę o opinie, wskazówki i linki do gotowych, lepszych rozwiązań.
Styczeń 15th, 2010 - 15:15
Ja wiem Sebastian że Ty lubisz iść pod prąd i wywarzać otwarte drzwi.
http://www.cplusplus.com/reference/string/string/replace/
Ale nie przesadzajmy, dobrze?
To tak samo jak ja pisałem funkcje sortujące w php ;p
Napisz coś ciekawego następnym razem ;> czekam z niecierpliwością. Poczytałbym coś ciekawego.
Styczeń 15th, 2010 - 16:49
No tak, tylko zauważ, że ja funkcję którą podałeś w linku użyłem u siebie.
string.replace() pozwala tylko na podmianę na podstawie pozycji, a moja funkcja wyszukuje podany ciąg znaków i go automatycznie zastępuje.
Więc to raczej nie jest jak funkcja sortująca w php
Styczeń 20th, 2010 - 10:00
No dobra, masz mnie ;p
Maj 20th, 2010 - 02:22
dobry poczatek
Sierpień 17th, 2010 - 00:31
Wydaje mi się, że błędem jest to, iż wyszukujesz podciąg zawsze od początku (“str.find(szukany)”), zamiast kontynuować. Powoduje to zwiększenie czasu operacji oraz może doprowadzić do nieskończonego zapętlenia (jeśli szukany ciąg jest podciągiem, na który zamieniasz).