Strona główna » Kursy » Kurs C++ » Klasa string
Aa
 

Klasa string

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

Wstęp

Operowanie na tablicach znaków nie jest zadaniem trudnym, ale czasem bardzo czasochłonnym. Wymaga to również swojego rodzaju dyscypliny, ponieważ nie można zapomnieć o nawet najmniejszym szczególe takim jak np. znak końca danych \0. Klasa string jest to klasa, która upraszcza proces zarządzania tekstem. Programista nie musi się martwić jak przechowywać tekst i dostaje bardzo dużo narzędzi do zarządzania tekstem.

Klasa string

W celu skorzystania z klasy string należy pamiętać, aby w nagłówku dołączyć bibliotekę string:

  1. #include <string>

Po dopisaniu tej jednej linijki można już zadeklarować pierwszą zmienną typu string, która pozwoli przechować dowolny tekst:

  1.   string str = "Testowanie klasy String";

Teraz pozostaje wypisać tekst na ekran. Można tego dokonać dobrze znanym już operatorem <<:

  1.   cout << str;

Jak widać wykorzystanie typu string jest bardzo proste i wygodne. W dalszej części postaram się przybliżyć jak w pełni wykorzystać potencjał zastosowanej klasy. Ze względu na to, że jest to klasa to zawiera ona już pewne gotowe metody, które pozwalają odczytać niektóre właściwości zmiennej.

Opis

I/O

Zadeklarowanie i nadanie wartości zmiennej zostało przedstawione w przykładzie. Do tego typu zmiennej można również stosować operator >>, który pozwoli wczytać tekst z dowolnego strumienia do zmiennej. Poniższy kod wczyta do zmiennej dane tekst odczytany z strumienia cin:

  1.   string dane;
  2.   cin >> dane;

W przypadku łączenia tablic należało napisać własną funkcję łączącą, która tworzyła nową tablicę, stawiała na końcu znak \0, a wszystkie znaczki z tablic przepisywała w odpowiedniej kolejności. W przypadku zmiennych string do łączenia można użyć operatora +. Poniższy przykład wypisze na ekran "C++":

  1.   string txtA = "C";
  2.   string txtB = "++";
  3.   string txtAB = txtA + txtB;
  4.   cout << txtAB;

Oczywiście do łączenie tekstów można też używać skróconej formy operatora + czyli += i wtedy poniższy kod również wypisze C++;

  1.   string txtC = "C";
  2.   txtC += "++";
  3.   cout << txtC;

Operatorowi + odpowiada funkcja string& append (const string& str) funkcji string, która pozwala dołączyć na koniec wybrany tekst oraz void push_back (char c), która pozwala dopisać na koniec pojedynczy znak typu char.

Odczytywanie / modyfikacja zmiennej

W celu odczytania i-tego znaku zmiennej typu string wystarczy operator []. W nawiasach kwadratowych należy umieścić indeks żądanego elementu. Podany niżej kod wypisze literę C oraz znak w oddzielnych linijkach.

  1.   string str = "C++";
  2.   cout << str[0] << endl;
  3.   cout << str[1] << endl;

Odpowiednikiem operatora [] jest funkcja at, która zwraca znak na i-tej pozycji podanej przez programistę jako argument wywołanej funkcji.

W przypadku, gdy wiadomo, że dana zmienna posiada konkretną niepustą wartość można skorzystać z funkcji back() do odczytania lub zmodyfikowania ostatniego znaku. Analogicznie dla pierwszego znaku zmiennej działa funkcja front(). Poniższy kod prezentuje wykorzystanie obydwu funkcji:

  1.   string strB = ";(";
  2.   strB.back() = ')';
  3.   strB.front() = ':';
  4.   std::cout << strB << '\n';

Właściwości zmiennej

Dotychczas w celu zliczenia znaków w tablicy należało użyć funkcji strlen. W przypadku typu string wystarczy wywołać funkcję size() lub length(), aby otrzymać długość zapisanego tekstu w zmiennej (konkretniej ile bajtów zajmuje zmienna).

  1.   string strC = "Jak dlugi jest ten tekst?";
  2.   cout << strC << "\n" << strC.size();

Ponadto jedną z ciekawszych rzeczy jest czy typ string może przechowywać nieskończenie długi tekst (zakładając nieskończenie wielką pamięć). Okazuje się, że ten typ może pomieścić maksymalnie 4,294,967,291 bajtów. Wartość tę można otrzymać poprzez funkcję max_size() zmiennej.

  1.   cout << "Maksymalny rozmiar: " << strC.max_size();

Czy jednak należy się martwić tym ograniczeniem? Tylko w przypadku bardzo dużego pliku, ponieważ 4,294,967,291 B ≈ 4,294,967,296 B = 4,194,304 kB = 4,096 MB = 4 GB. Jest to związane z tym jak działa komputer. Oficjalnie w dokumentacji jest zapisane, że utworzenie tak dużej zmiennej nie zawsze musi się udać.

Porównywanie

Ciągi tekstów nie są już liczbami, więc ich porównywanie wymaga innego podejścia. W celu porównania zmiennych typu string można skorzystać z funkcji compare(), która zwraca trzy różne wartości: 0 - wartości są identyczne. W przypadku, gdy tekst podany jako argument do porównania jest większy pod względem leksykograficznym to zwrócona zostaje wartość 1, a w przeciwnym -1.

Poniższy przykład powinien wyjaśnić te różnice:

Porównaniezwynik
abcabc0
abcabcd-1
abcbcd1
abcdbcd-1

Podsumowanie

Klasa String dostarcza jeszcze bardzo dużo różnych funkcji, ale przedstawione tutaj pozwalają dostrzec przewagę takiego rozwiązania nad tablicami. Zachęcam do zapoznania się z pozostałymi funkcjami i stosowania ich w swoich programach.

Zadania

Zadanie 1

Wczytaj od użytkownika imię, a następnie przywitaj go. Przykładowo jeśli użytkownik ma na imię Jan program może wyświetlić:

  1. Cześć Jan!

Zadanie 2

Wczytaj od użytkownika tekst, a następnie wyświetl co drugi znak wczytanego tekstu zaczynając od pierwszego. Przykładowo dla tekstu "INFORMACJA" program wypisze:

  1. IFRAJ

Zadanie 3

Napisz funkcję string usunCyfry(string dane), która zwróci dane bez żadnych cyfr. Przetestuj program wczytując od użytkownika tekst, a następnie usuń z niego wszystkie cyfry i wypisz nowy tekst na ekran. Przykładowo dla tekstu "a1b2c3" to program powinien wypisać:

  1. abc