Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Pobierz materiał do EPUB Pobierz materiał do MOBI Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

Na łańcuchach znaków operujemy, sprawdzając, czy podane słowa są palindromami lub anagramami. Używamy ich również w niektórych szyfrach, takich jak na przykład szyfr Cezara.

Biblioteka string

Aby stworzyć łańcuch string oraz skorzystać z funkcji opisanych w tej lekcji, musimy najpierw dołączyć do programu bibliotekę string. Są w niej zawarte różne funkcje umożliwiające wykonywanie operacji na łańcuchach znaków.

Bibliotekę string dołączymy, wpisując następujący kod:

Linia 1. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny.

Wykorzystamy również przestrzeń nazw:

Linia 1. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny. Linia 2. using namespace std średnik.

Sposoby pobierania tekstu

Załóżmy, że chcemy pobrać od użytkownika jego imię i nazwisko. Możemy to zrobić, używając predefiniowanego strumienia wejścia cin.

Prawdopodobnie początkowo zapiszemy instrukcje w taki sposób:

Linia 1. string imieINazwisko średnik. Linia 2. cout otwórz nawias ostrokątny otwórz nawias ostrokątny “Podaj swoje imię i nazwisko dwukropek cudzysłów średnik. Linia 3. cin zamknij nawias ostrokątny zamknij nawias ostrokątny imieINazwisko średnik.

Pozwoli to co prawda przyjąć dane od użytkownika, ale może się zdarzyć, że nie zostaną one wczytane w całości. Jeśli pomiędzy imieniem i nazwiskiem pojawi się odstęp (spacja), pobrane zostanie jedynie imię. Wynika to z faktu, że strumień cin traktuje wszystkie białe znakibiały znakbiałe znaki jako koniec wpisywanego ciągu.

Istnieją dwa rozwiązania tego problemu. Pierwszym z nich byłoby poproszenie użytkownika o wpisanie najpierw imienia, potem nazwiska:

Linia 1. string imie średnik. Linia 2. string nazwisko średnik. Linia 3. cout otwórz nawias ostrokątny otwórz nawias ostrokątny “Podaj swoje imie dwukropek cudzysłów średnik. Linia 4. cin zamknij nawias ostrokątny zamknij nawias ostrokątny imie średnik. Linia 5. cout otwórz nawias ostrokątny otwórz nawias ostrokątny “Podaj swoje nazwisko dwukropek cudzysłów średnik. Linia 6. cin zamknij nawias ostrokątny zamknij nawias ostrokątny nazwisko średnik.

Możemy również pobrać dane za pomocą funkcji getline(). W tym przypadku kod wyglądałby następująco:

Linia 1. string imieINazwisko średnik. Linia 2. cout otwórz nawias ostrokątny otwórz nawias ostrokątny “Podaj swoje imię i nazwisko dwukropek cudzysłów średnik. Linia 3. getline otwórz nawias okrągły cin przecinek imieINazwisko zamknij nawias okrągły średnik.

W funkcji getline() pierwszym argumentem jest strumień, za pomocą którego chcemy pobrać dane, a drugim string – do którego chcemy zapisać ciąg znaków. Ponieważ funkcja getline() nie traktuje spacji jako końca strumienia danych, nadaje się do pobierania całych wierszy tekstu, w przypadku których wyrazy rozdzielone są spacjami.

Funkcje length()size()

Są to metody, które zwracają informację o długości łańcucha znaków.

Zmienne łańcuchowe typu string, w przeciwieństwie do zwykłych tablic, dają nam możliwość sprawdzenia liczby znaków składających się na ciągi. Jest to szczególnie przydatne w sytuacjach, w których np. mamy zliczyć, ile razy dany znak występuje w ciągu. Załóżmy, że chcemy policzyć, ile zer pojawiło się w ciągu zer i jedynek. Zrobimy to w następujący sposób:

Linia 1. string ciag znak równości cudzysłów 00001 cudzysłów średnik. Linia 2. int liczbaZer znak równości 0 średnik. Linia 4. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny ciag kropka size otwórz nawias okrągły zamknij nawias okrągły średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. if otwórz nawias okrągły ciag otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości znak równości apostrof 0 apostrof zamknij nawias okrągły liczbaZer plus plus średnik. Linia 6. zamknij nawias klamrowy.

Jak widać, metody te mogą posłużyć za wartość, której użyjemy do określenia warunku powtórzenia pętli. Użyliśmy tutaj metody size(), ale równie dobrze w jej miejsce moglibyśmy wstawić length(). Nie ma między nimi większej różnicy, a efekt zastosowania jest ten sam.

Co prawda w pokazanym przykładzie moglibyśmy z łatwością sami policzyć, z ilu znaków składa się łańcuch – nie jest to duża ani zmieniająca się wartość. W przypadku, gdy łańcuch znaków jest o wiele dłuższy lub jego długość nie jest stała, wykonanie tej samej operacji bez użycia wspomnianych metod byłoby trudne.

W zadaniach maturalnych często wymaga się, by zdający wykonali operacje na dużej liczbie ciągów znaków zapisanych w pliku tekstowym. Oznacza to konieczność wielokrotnego wczytania każdego ciągu do łańcucha znaków o tej samej nazwie. Ponieważ są one różnej długości, metody length() oraz size(), okazują się niezwykle przydatne.

Zmiana zawartości łańcucha znaków

Każdy znak w łańcuchu znaków ma swój indeks, który jest liczbą naturalną. Numerację zaczynamy od 0. Dla łańcucha znaków test indeks pierwszej litery t to 0, a indeks litery s to 2.

Załóżmy, że chcemy znaleźć, a następnie wypisać pozycję ciągu znaków test w łańcuchu znaków To jest wpis testowy. Służy do tego funkcja find(), której nazwę łatwo jest zapamiętać, ponieważ znajduje ona (ang. find) pozycję podanego ciągu znaków.

Linia 1. string tekst znak równości “To jest wpis testowy cudzysłów średnik. Linia 2. cout otwórz nawias ostrokątny otwórz nawias ostrokątny tekst kropka find otwórz nawias okrągły “test cudzysłów zamknij nawias okrągły średnik.

Gdy znajdziemy już pozycję wspomnianego ciągu znaków, możemy jej użyć w kolejnej funkcji, aby zamienić odszukany wyraz na inny. Skorzystamy przy tym z funkcji replace().

Załóżmy, że w łańcuchu To jest wpis testowy chcemy zmienić wyraz testowy na nowy. Aby to zrobić, wpiszemy następującą linię kodu:

Linia 1. tekst kropka replace otwórz nawias okrągły tekst kropka find otwórz nawias okrągły “test cudzysłów zamknij nawias okrągły przecinek 4 przecinek “n cudzysłów zamknij nawias okrągły średnik.
Ważne!

Zauważmy, że literę n wpisaliśmy w cudzysłowie, nie zaś między apostrofami tak jak wcześniej. Wynika to z faktu, że trzeci argument funkcji replace() jest typu string. Apostrofy służą zaś do oznaczania pojedynczego znaku, czyli typu char.

Po zakończeniu działania funkcji zawartość łańcucha zmieni się z To jest wpis testowy na To jest wpis nowy.

Słownik

biały znak
biały znak

każdy znak, który jest niewidoczny; przykładami białych znaków są spacja, znak tabulacji, znak końca linii lub dowolny inny znak, który nie ma kształtu na ekranie