Potasiak Blog "Wyobraźnia jest ważniejsza od wiedzy"

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ń.

Podziel się z innymi
  • Digg
  • del.icio.us
  • Facebook
  • email
  • Wykop
  • Twitter
Komentarze (5) Trackbacks (0)
  1. 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? :P 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.

  2. 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 :)

  3. No dobra, masz mnie ;p

  4. 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).


Dodaj komentarz


Brak trackbacków.