Tworząc własne programy praktycznie zawsze pracuje się z tekstem, a skoro tak to warto poświęcić czas na to by poznać możliwości jakie dostajemy za darmo korzystając z klasy
std::string. Większość częściej stosowanych narzędzi do pracy z tekstem zostanie omówiona w niniejszym rozdziale - resztę zawsze możesz doczytać w dokumentacji C++.
Sprawdzanie długości tekstu
Do sprawdzania długości tekstu służą dwie metody klasy
std::string. Tymi metodami są:
size oraz
length. Przykład zastosowania metody
size został już zaprezentowany w przykładach, które miały miejsce w poprzednim rozdziale. Metoda
length zwraca tą samą wartość. W programowaniu współczesnym zaleca się aby używać metody
size do odczytywania długości tekstu, a metodę
length uważa się na dzień dzisiejszy za przeżytek. Metoda
length pozostała standardzie C++ ze względów historycznych i zaleca się unikać używania wspomnianej metody w nowo pisanych aplikacjach. Oto krótki przykład prezentujący działanie metody
size oraz
length:
#include <iostream>
#include <string>
int main()
{
std::string sNapis = "To jest napis";
std::cout << "Napis: " << sNapis << std::endl;
std::cout << "Dlugosc napisu to (metoda size): " << sNapis.size() << std::endl;
std::cout << "Dlugosc napisu to (metoda length): " << sNapis.length() << std::endl;
return 0;
}
Pamiętaj, że: Długość tekstu to liczba znaków występujących w tekście.
|
Łączenie tekstów
Klasa
std::string umożliwia nam sklejanie tekstów. Do sklejania tekstu można wykorzystać przeciążony operator
+= bądź wywołać metodę
append - w obu przypadkach tekst zostanie doklejony na końcu już istniejącej treści. Przykład:
std::string tekst = "abc";
tekst += "def";
tekst.append( "ghi" );
std::cout << tekst;
Wstawianie treści w dowolnym miejscu tekstu
Klasa
std::string umożliwia również wstawianie nowej treści w dowolnym miejscu istniejącego tekstu - do tego celu wykorzystuje się metodę
insert. Metoda ta posiada wiele wersji wywołań lecz w tym miejscu omówimy tylko najprostszą z dostępnych, która jednocześnie zrealizuje oczekiwane przez nas zadanie. Pierwszym argumentem wspomnianej metody jest pozycja na której ma zostać wstawiony nowy tekst. Pozycja ta jest numerem znaku przed którym ma zostać dopisana nowa treść (pamiętaj, że pozycje są numerowane od zera). Drugim argumentem jest treść, która ma zostać dopisana we wskazanym miejscu do już istniejącego tekstu. Przykład:
std::string tekst = "abc";
tekst.insert( 1, "def" );
std::cout << tekst;
Należy pamiętać aby pozycja wstawiania tekstu nie była większa niż całkowita długość tekstu do którego ma zostać dopisana nowa treść. |
Usuwanie wybranego fragmentu tekstu
Kolejną operacją jaką umożliwia nam klasa
std::string jest usuwanie tekstu. Operację usuwania tekstu możemy wykonać za pomocą kilku metod jakie udostępnia nam klasa
std::string. W tym miejscu omówię metodę najprostszą i jednocześnie najbardziej praktyczną z punktu widzenia przeciętnego programisty. Aby usunąć fragment tekstu znajdującego się w obiekcie typu
std::string należy skorzystać z metody
erase. Jedna z metod
erase ma następującą postać:
std::string & erase( size_type pozycja, size_type liczba_znakow );
Pierwszym argumentem w powyższej metodzie jest pozycja od której chcemy kasować znaki (przypominam, że pozycje znaków numerujemy od zera). Drugim argumentem jest liczba znaków, które chcemy usunąć z tekstu. Usuwając tekst należy pamiętać aby pozycja pierwszego znaku była prawidłowa, czyli nie była większa lub równa liczbie znaków występujących w tekście. Przykład:
#include <iostream>
#include <string>
int main()
{
std::string sNapis = "[Kurs C++] std::string - Modyfikowanie tekstu.";
sNapis.erase( 10, 14 );
std::cout << sNapis << std::endl;
return 0;
}
Standardowe wyjście programu:
[Kurs C++] Modyfikowanie tekstu.
Kopiowanie tekstu
Ostatnią operacją, którą omówię w niniejszym rozdziale jest kopiowanie tekstu. Klasa
std::string do kopiowania tekstu posiada metodę
copy. Metoda
copy nie zostanie jednak omówiona, bowiem jest ona po pierwsze niewygodna, po drugie jest niepraktyczna z punktu widzenia C++, no i po trzecie - jest metoda z którą znacznie lepiej się Ci będzie tekst kopiowało. Tym wygodnym i praktycznym narzędziem metoda
insert z tym, że należy skorzystać z innej wersji niż ta, którą poznałeś prawie na początku niniejszego rozdziału. Zanim jednak skopiujemy wybrany fragment tekstu, skopiujmy najpierw cały tekst z jednej zmiennej do drugiej za pomocą rozwiązania, które już znamy:
#include <iostream>
#include <string>
int main()
{
std::string sNapis = "[Kurs C++] std::string - Kopiowanie tekstu.";
std::string sDrugiNapis;
sDrugiNapis.insert( 0, sNapis );
std::cout << sDrugiNapis << std::endl;
return 0;
}
Standardowe wyjście programu:
[Kurs C++] std::string - Kopiowanie tekstu.
Zgodnie z opisem znanej Ci już metody
insert, podane w przykładzie wywołanie wstawi przed pozycją zero tekst przekazany poprzez drugi argument, którym jest akurat zmienna tekstowa. Klasa
std::string posiada również metodę
insert za pomocą której możemy określić dodatkowo od którego znaku chcemy skopiować tekst przekazany poprzez drugi argument oraz maksymalnie ile znaków chcemy skopiować. Tak więc aby skopiować fragment tekstu z innej zmiennej tekstowej należy wykorzystać metodę:
std::string & insert(
size_type pozycja,
const std::string & tekst,
size_type kopiuj_od_znaku,
size_type liczba_znakow_do_skopiowania
);
Jak zapewne domyślasz się z zastosowanych opisów to pierwszy i drugi argument ma takie samo znaczenie jak w przypadku znanej Ci już metody
insert, natomiast argument trzeci określa pozycję od którego znaku należy kopiować tekst, a argument czwarty ile maksymalnie znaków ma zostać skopiowanych. Przykład:
#include <iostream>
#include <string>
int main()
{
std::string sNapis = "[Kurs C++] std::string - Kopiowanie tekstu.";
std::string sFragmentTekstu;
sFragmentTekstu.insert( 0, sNapis, 1, 8 );
std::cout << sFragmentTekstu << std::endl;
return 0;
}
Standardowe wyjście programu:
Kurs C++
Podsumowując, linijkę:
sFragmentTekstu.insert( 0, sNapis, 1, 8 );
należy rozumieć następująco:
Wstaw przed pozycją zero tekst z obiektu sNapis od pozycji pierwszej osiem kolejnych znaków.
|
Zadanie domowe
Napisz program, który z podanego łańcucha znaków usunie powtarzające się spacje występujące obok siebie i zastąpi wszystkie znaczniki <b> oraz </b> znacznikami [b] oraz [/b]. Tekst, który powstanie w wyniku przeprowadzenia wspomnianych operacji wypisz na ekran. Przykładowy fragment aplikacji, który możesz wykorzystać:
#include <iostream>
#include <string>
std::string konwertuj( std::string sTekst )
{
std::string sWynik;
return sWynik;
}
int main()
{
std::cout << konwertuj( "<b>to jest </b> testowy napis <b>:)" ) << std::endl;
std::cout << konwertuj( " s a m e sp a c j e" ) << std::endl;
std::cout << konwertuj( "<<B><//b><i></i>" ) << std::endl;
return 0;
}
Oczekiwane wyjście programu:
[b]to jest [/b] testowy napis [b]:)
s a m e sp a c j e
<<B><//b><i></i>