Strona główna » Kursy » Kurs C++ » Operacje na typie string
Aa
 

Operacje na typie string

· część 1 · część 2 ·

Wstęp

W poprzedniej części o klasie string zostały opisane podstawowe funkcje oraz operatory tej klasy. W tej części zostaną przedstawione pozostałe funkcje modyfikujące, które mogą znaleźć zastosowanie w wielu różnych projektach. Dotyczą one przede wszystkim wybierania fragmentów oraz przeszukiwania.

Przykłady

Nadawanie wartości

Najwygodniejszym sposobem na przypisywanie wartości zmiennej typu string jest użycie operatora przypisania =. Niemniej to samo można osiągnąć używając funkcji assign(). Przykładowo w celu przypisania zmiennej wartości równoważne są linijki:

  1.   str = "tekst";
  1.   str.assign("tekst");

Funkcja assign() może przyjmować różne zestawy argumentów. Na uwagę zasługuje tutaj jeszcze możliwość zapisania do zmiennej n razy tego samego znaku c. W cely przypisania do zmiennej wielokropka (złożonego z trzech kropek) wystarczy wpisać:

  1.   str.assign(3, '.');

Łączenie tekstów

Część ta jest rodzajem przypomnienia z poprzedniej części jak można dołączać inny tekst do zmiennej. Przede wszystkim dobrze znanym operatorem + w (2.) formie ogólnej oraz (3.) skróconej:

  1.   string dane = "Język C";
  2.   dane = dane + "++";
  3.   dane += "++";

Odpowiadającą operatorowi funkcją jest append(), które jako argument przyjmuje inny tekst w celu dołączenia go do zmiennej.

  1.   string dane = "Język C";
  2.   dane = dane + "++";
  3.   dane += "++";

String, a znak

W celu dołączenia znaku do wybranej zmiennej string można korzystać z wymienionych wcześniej metod dołączania tekstu, ale można też skorzystać z funkcji push_back(), która dopisuje podany jako argument znak c.

  1.   dane.push_back('+');

Funkcją o przeciwnym działaniu jest pop_back(), która usuwa ostatni znak zapisany w zmiennej. Nie przyjmuje ona żadnych argumentów. Przed jej zastosowaniem należy upewnić się, że dana zmienna nie jest pusta, ponieważ może nastąpić wtedy nieoczekiwany wyjątek.

  1.   dane.pop_back();

Wybieranie fragmentu tekstu

Bardzo często z całego wyrażenia przydałoby się skopiować tylko fragment. Do generowania nowego wyrażenia na podstawie konkretnego fragmentu służy funkcja substr(), która zwraca fragment zaczynający się od podanej pozycji pos o długości len. Przykładowo, aby wybrać z wyrażenia "czerwony zielony niebieski" słowo "zielony" należy wpisać:

  1.   string kolory = "czerwony zielony niebieski";
  2.   string kolor = kolory.substr(9, 7);

Usuwanie fragmentu tekstu

Usunąć cały tekst w zmiennej można na dwa sposoby: pierwszy polega na przypisaniu zmiennej pustego łańcucha tekstu. Jednak istnieje prostsze rozwiązanie. Mowa tu o funkcji erase(). Funkcja nie zwraca żadnej wartości i nie przyjmuje żadnego argumentu.

  1.   dane.clear();

W przypadku próby usuwania konkretnych znaków z tekstu warto zastosować funkcję erase(). Pierwszy zestaw argumentów jaki można jej przekazać to pozycja pos od której ma zostać usuniętych len znaków. Usunięte zostaną wtedy wszystkie znaki z przedziału [pos, pos + len). Przykładowo, aby usunąć z tekstu "zostaw usun" fragment " usun" należy wpisać:

  1.   // Usuwanie fragmentu tekstu
  2.   string txt = "zostaw usun to";

Wstawianie tekstu

W celu wstawienia innego tekstu na konkretną pozycję w innym tekście można skorzystać z funkcji insert(), która jako argumenty przyjmuje pozycję pos oraz tekst do wstawienia str. Przykładowo, aby na początek wyrażenia "informacja" dopisać "tajna " wystarczy (3.) linijka:

  1.   string tekst = "informacja";
  2.   string wstaw = "tajna ";
  3.   tekst.insert(0, wstaw);

Zastępowanie fragmentu

Zastępowanie w C++ polega na wskazaniu fragmentu tekstu, który ma zostać zastąpiony przez inny tekst. Stosuje się do tego funkcję replace(), która kolejno przyjmuje pos - pozycję pierwsze znaku do zastąpienia oraz len - ile znaków ma zostać zastąpionych, trzeci argument str - określa tekst do wstawienia zamiast wybranego fragmentu znaków o indeksach [pos, pos + len).

W celu zamiany w wyrażeniu "a d c.." fragmentu " d" na " b" należy zapisać:

  1.   string alfabet = "a d c..";
  2.   string zamien = "b ";
  3.   tekst.replace(2, 3, zamien);

Jej działanie różni się od innych funkcji replace() w innych językach, gdzie podaje się dwa wyrażenia tekstowe i wystąpienie pierwszego wyrażenia jest zastępowane drugim.

Wyszukiwanie

Przypuśćmy, że jest pewne wyrażenie tekst w którym istnieje potrzeba znalezienia określonych informacji. Klasa string zawiera kilka funkcji, które pozwalają na szybkie wyszukanie danych w dowolnym miejscu.

Szukanie fragmentu

Jedna z nich to find(), która szuka podanego wyrażenia str w zmiennej. Istnieje jej analogiczna wersja rfind(), która też szuka wyrażenia str w zmiennej, ale od końca. Wynikiem jest indeks od którego rozpoczyna się podane wyrażenie str. W przypadku nie znalezienia funkcje zwracają stałą string::npos, która wynosi -1.

Przypuśćmy, że tekst to "bardzo szybko dane sa wyszukiwane". Wtedy dla podanych argumentów zostaną zwrócone następujące dane:

strfind(str)rfind(str)
szbardzo szybko dane sa wyszukiwanebardzo szybko dane są wyszukiwane
724
danebardzo szybko dane sa wyszukiwanebardzo szybko dane są wyszukiwane
1414
abcbardzo szybko dane sa wyszukiwanebardzo szybko dane są wyszukiwane
string::nposstring::npos

Pierwszy z

Warta uwagi jest funkcja find_first_of(), która przyjmuje jako argument znaki zapisane jako tekst. Jej zadaniem jest znalezienie pierwszej pozycji któregokolwiek z wymienionych znaków. Analogicznie działa funkcja find_last_of(), która wyszukuje od końca. W przypadku nie znalezienia obie funkcje zwrócą string::npos.

Przypuśćmy, że tekst to "abrakadabra". Wtedy dla podanych argumentów zostaną zwrócone następujące dane:

strfind(str)rfind(str)
abcabrakadabraabrakadabra
010
kabrakadabraabrakadabra
44
mnoabrakadabraabrakadabra
string::nposstring::npos

Szukanie niewłaściwych znaków

Użytkownik bywa omylny, a programista powinien być tego świadom. Dla komputera nie zawsze jest wszystko jedno jakie dane otrzyma. Bardzo często wprowadzony tekst należy sprawdzić czy zawiera dane tylko konkretnego typu. W przypadku niespełnienia warunków program może poprosić o wprowadzenie innych danych, albo dokonać korekty danych usuwając zbędne dane.

Do sprawdzania czy dane wyrażenie składa się tylko z poprawnych znaków można skorzystać z funkcji find_first_not_of() tym razem działanie tej funkcji polega na tym, aby podać indeks pierwszego znaku, który nie występuje w przekazanym wyrażeniu str. Tak samo jak poprzednio istnieje funkcja analogiczna find_last_not_of(), która poszukuje od końca. W przypadku, gdy wszystkie znaki z zmiennej występują w str to program zwróci str::npos.

Przypuśćmy, że tekst to "abc1234_xyz". Wtedy dla podanych argumentów zostaną zwrócone następujące dane:

strfind(str)rfind(str)
abcxyzabc1234_xyzabc123_xyz
37
_.,abc1234_xyzabc1234 xyz
010
_abcxyz1234abc1234_xyzabc1234_xyz
string::nposstring::npos

Podsumowanie

Jak można zauważyć klasa string dostarcza bardzo dużo przydatnych funkcji. Oczywiście nie trzeba wszystkich znać na pamięć, ale z pewnością świadomość ich istnienia mogłaby okazać się bardzo pomocna. Proponuje zajrzeć do kodów źródłowych, aby prześledzić lekcję jeszcze raz. Po powtórzeniu warto wykonać dołączone zadania.

Zadania

Zadanie 1

Poproś użytkownika o podanie imienia i nazwiska. Następnie zamień obydwa wyrażenia miejscami. W rozwiązaniu nie wolno wykorzystać operatora łączenia, ani funkcji append(). Przykładowo jeśli użytkownik wprowadzi:

  1. Jan Kowalski

program wypisze na ekran:

  1. Kowalski Jan

Zadanie 2

Napisz program, który wczyta od użytkownika dwie linijki tekstu. Pierwsza linijka będzie zawierać tekst w którym wszystkie znaki z drugiej linijki powinny zostać zastąpione znakiem kratki #. Przykładowo jeśli użytkownik wprowadzi tekst "abrakadabra" i "abc" program powinien wypisać:

  1. ##r#k#d##r#

Zadanie 3

Napisz program, który zapyta użytkownika o ulubioną liczbę, a następnie wczyta od użytkownika linijkę tekstu, a program sprawdzi czy wczytane wyrażenie jest liczbą. W przypadku, gdy wyrażenie jest liczbą powinien wypisać np. "Twoja ulubiona liczba to 2!", a w przypadku, gdy wyrażenie nie jest liczbą program powinien poprosić o podanie liczby jeszcze raz. Oto przykładowy zapis na konsoli:

  1. podaj ulubiona liczbe:
  2. I00
  3. wprowadzona liczba jest niepoprawna
  4. podaj ulubiona liczbe
  5. 7
  6. Twoja ulubiona liczba to 7!