Metody klasy String C++ - Binarnie.pl (2024)

Klasa String przetwarzająca ciągi znakowe w C++ wykorzystywana jest w znacznej części programów napisanych z wykorzystaniem tej technologii. W końcu operacje na łańcuchach znaków to chleb powszedni dla wielu aplikacji. Na szczęście człowiek jest na tyle leniwym stworzeniem, aby opracować dedykowaną tym operacjom klasę. Tak, aby każdy programista chcący zaimplementować działania na tekście, nie był zmuszony do wymyślania koła na nowo. Zapraszam, szczególnie początkujących programistów C++ do zapoznania się z wybranymi metodami klasy String w C++.

Metody klasy String C++ - Binarnie.pl (1)

Porównanie klasy String z typem char

Te porównanie dla wielu wydawać się może bezcelowe, ale od czegoś trzeba zacząć. W dodatku takie zestawienie z pewnością przyniesie korzyść osobom początkującym, którym dedykuję ten wpis.

Typ char (ang. character) jest wbudowanym typem języka C++ służącym do reprezentacji pojedynczego znaku o wielkości 1 bajta. Stąd zmienna tego typu może przechowywać tylko jeden znak pod postacią liczbową od -128 do 127. Można śmiało założyć, że poza rozmiarem typ ten niczym nie różni się od pozostałych typów prostych języka. Wszakże zmienną typu int też możemy zmusić do wyświetlania znaków prostym zabiegiem: cout << char(290);. Chcąc posłużyć się więcej, niż jednym znakiem tworząc łańcuch, musimy użyć w tym celu typu tablicowego, który umożliwi nam umieszczenie znaków w tablicy jeden po drugim tak aby tworzyły planowanych ciąg. Przychodzą mi trzy, niewywołujące mdłości u kompilatora metody na zaimplementowanie ciągu znaków za pomocą typu char:

C++

1

2

3

4

5

char a[] = "Ala ma kota";

char b[12] = "Ala ma kota";

const char* c = "Ala ma kota";

Typowi char można oddać niską złożoność pamięciową. Wystarczy jeden wskaźnik w postaci nazwy tablicy, aby odwołać się do całego ciągu.

Opis klasy String należy zacząć od prostej obserwacji. Nie jest to wbudowany typ prosty języka, a zaprojektowana klasa – typ złożony zawierający własne zmienne i metody. Wchodzi w skład przestrzeni nazw std. Służy do reprezentacji ciągu znaków. Posiada rozbudowany zestaw metod dostosowanych do działań na łańcuchach takich jak:

  • Wyszukiwanie znaków,
  • Zamiana znaków,
  • Wstawianie nowych znaków,
  • Usuwanie znaków

Większość funkcji umożliwiających operowanie na zmiennych typu char pochodzi z pliku nagłówkowego string.h/cstring. Należy uważać, bowiem nie jest to ten sam plik co w przypadku klasy String w C++. Chcąc z niej skorzystać zawrzemy w kodzie dyrektywę #include <string>.

Tworzenie obiektu klasy String

Obiekty klasy String możemy tworzyć za pomocą przeładowanego konstruktora klasy – funkcji inicjalizującej, wywoływanej przy tworzeniu nowego obiektu. Oto lista wybranych konstruktorów:

string() – konstruktor domyślny, tworzy pusty ciąg znaków.

string(const char *s) – konstruktor inicjalizuje obiektu za pomocą przekazanego jako argument parametru w postaci ciągu znaków. Przykład użycia:

C++

1

2

3

4

5

6

const char *lancuch1="Kot";

char tablica[] = "Papugi";

string lancuch2(lancuch1);

string lancuch3("Pies");

string lancuch4(tablica);

string(const string & str) – konstruktor inicjalizuje obiekt za pomocą przekazanego jako argument innego obiektu klasy String. Przykład użycia:

C++

1

2

string lancuch1("Pies");

string lancuch2(lancuch1);

string(size_t n , char c) – konstruktor tworzący obiekt zawierający łańcuch złożony z n wystąpień znaku c. Przykład użycia:

C++

1

string lancuch(15, 'c');

string(const char *s, size_t n) – konstruktor tworzący łańcuch o długości n znaków, rozpoczynający się od ciągu s. Przykład użycia:

C++

1

2

3

4

const char *lancuch1="Kot";

string lancuch2(lancuch1, 5); // "Kot"

string lancuch3(lancuch1,2); // "Ko"

string(const string & str, size_t pos, size_t n = npos) – konstruktor kopiujący do obiektu n znaków z przekazanego parametru str począwszy od indeksu pos. Parametr n domyślnie zawiera liczbę stanowiącą limit długości łańcucha znaków obiektu klasy String. Przykład użycia:

C++

1

2

3

4

string lancuch1("Białobrzegi Radomskie);

string lancuch2(lancuch1, 12); //Radomskie

string lancuch3(lancuch2, 0, 5); //Radom

template <class Iter>

string (Iter begin, Iter end) – inicjalizuje obiekt wartościami z przedziału [begin, end) co oznacza, że znak znajdujący się pod wskaźnikiem – end nie zostanie ujęty w przedziale. Przykład użycia:

C++

1

2

3

4

string lancuch1("Ala ma kota");

string lancuch2(lancuch1.begin(), lancuch1.end()); //Ala ma kota

string lancuch3(lancuch1.rbegin(), lancuch1.rend()); //atok am alA

Metody klasy String dotyczące pamięci przechowującej dane

Funkcje tutaj wymienione służą do czytania oraz edytowania wielkości pamięci przechowującej łańcuchy znaków.

  • size() / length() – obie metody zwracają ilość pojedynczych znaków w łańcuchu.
  • resize() – zmienia długość przechowywanego znaku.
  • max_size() – zwraca maksymalną długość jaką może osiągnąć łańcuch. Zwracana wartość może różnić się od parametru npos, który stanowi maksymalną wielkość zmiennej przechowującej długość łańcucha.
  • capacity() – zwraca ilość bajtów zarezerwowaną dla łańcucha.
  • reserve() – za pomocą tej metody ustalamy ilość bajtów zarezerwowaną dla łańcucha.
  • shrink_to_fit() – metoda ta dostosowuje ilość bajtów zarezerwowaną dla łańcucha do jego długości.
  • empty() – metoda zwraca prawdę, jeżeli łańcuch jest pusty, tzn. ma długość równą zero oraz fałsz w przeciwnym wypadku.
  • clear() – usuwa wszystkie znaki zawarte w łańcuchu.

C++

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

string lancuch("ABCDEFGHIJK");

cout << lancuch.size() << endl; //11

cout << lancuch.length() << endl; //11

cout << lancuch.capacity() << endl; //15

cout << lancuch.max_size() << " rozne od " << string::npos << endl; //2147483647 vs. 4294967295

lancuch.resize(50);

cout << "|" << lancuch << "|" << endl; // |ABCDEFGHIJK |

cout << lancuch.length() << endl; // 50

cout << lancuch.capacity() << endl; //50

lancuch.resize(5);

cout << "|" << lancuch << "|" << endl; // |ABCDE|

cout << lancuch.length() << endl; // 5

cout << lancuch.capacity() << endl; //50

lancuch.shrink_to_fit();

cout << lancuch.capacity() << endl; // 15, nie 5 ponieważ 15 to minimum

cout << lancuch.empty() << endl; // 0

lancuch.clear();

cout << lancuch.empty() << endl; // 1

Elementy dostępu klasy String

Do poszczególnych elementów obiektu, znaków w łańcuchu możemy dostać się na następujące sposoby:

  • Korzystając z operatora nawiasów kwadratowych [] tak jak ma to miejsce w przypadku tablic,
  • Korzystając z metody .at() zwracającej znak pod indeksem przekazanym do niej,
  • Korzystając z metody .back() zwracającej znak na ostatniej pozycji w łańcuchu,
  • Korzystając z metody .front() zwracającej znak na pozycji 0 w łańcuchu

C++

1

2

3

4

5

6

7

8

9

string lancuch("Szczebrzeszyn");

cout << lancuch[0] << endl; // S

cout << lancuch.at(0)<< endl; // S

cout << lancuch.front()<< endl; // S

cout << lancuch[lancuch.length()-1] << endl; // n

cout << lancuch.at(lancuch.length()-1) << endl; // n

cout << lancuch.back() << endl; // n

Wybrane metody klasy String C++

Trochę ograniczę swoje zapędy żeby wpis nie okazał się spolszczeniem dokumentacji 😀

.c_str() – przydatna funkcja w momencie, gdy potrzebujemy otworzyć plik tekstowy. Klasa Fstream i jej metody przewidują przekazywanie wskaźnika do tablicy znaków (char) jako nazwy otwieranego pliku. Metoda ta zwraca właśnie taki wskaźnik do tablicy znaków zawierającej łańcuch z obiektu, na którym jest wywoływany z dołączonym znakiem pustym ‘/0’. Przykład zastosowania:

C++

1

2

3

4

5

6

7

8

9

string lancuch("plik.txt");

ifstream file;

//file.open(lancuch); //bez kompilatora obslugujacego C++11 nie pojdzie

file.open(lancuch.c_str());

if(!file)

cout << "nie wyszło";

file.close();

Od C++11 klasa Fstream nie wymaga przekazywania wskaźnika do tablicy.

.push_back(char c) – dołącza na koniec łańcucha przekazany znak. Jego przeciwieństwem jest .pop_back(). Ta metoda usunie ostatni znak z łańcucha. Przykład użycia:

C++

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

string lancuch;

char znak = 'a';

while(znak<='z') {

lancuch.push_back(znak);

znak++;

}

cout << lancuch << endl; // cały alfabet

while (lancuch.back()!='d') {

lancuch.pop_back();

}

cout << lancuch << endl; // abcd

.find() – przeładowana funkcja służąca do znajdowania pojedynczych znaków, bądź całych ciągów znaków w łańcuchu. Funkcja przydatna w momencie, gdy chcemy np. sprawdzić czy dane ciąg zawiera poszukiwany podciąg. Przykład użycia:

C++

1

2

3

4

5

6

7

8

9

string lancuch("Ala ma kota");

cout << lancuch.find("kot") << endl; // 7

cout << lancuch.find("Ala", 3) << endl; // pod indeksie 3 nie ma podciągu Ala

cout << lancuch.find('m') << endl; // 4

cout << lancuch.find('m', 5) << endl; // pod indeksie 5 nie ma znaku m

string lancuch2("ma");

cout << lancuch.find(lancuch2) << endl; // 4

.compare(const string &str) i .compare(const char * s) – metoda ta służy do porównywania zawartości łańcucha przechowywanego w obiekcie do zadanego ciągu według wielkości odpowiadających znakom liczb w tablicy znaków ASCII. Z uwagi na to cyfry będą interpretowane jakby były przed wielkimi literami, a te z kolei mają pierwszeństwo przed małymi literami. Funkcja zwraca:

  • 0 – gdy teksty są takie same,
  • <0 – gdy tekst z obiektu, na którym wywoływana jest „pierwszy” według w.w. kolejności,
  • >0 – gdy tekst przekazany jako parametr jest „pierwszy”

Z reguły zwracanymi wartościami, gdy teksty nie są identyczne, są -1 i 1, ale gdy do pewnego momentu teksty są takie same, a następnie jeden się skończy to zwrócone liczby informują o różnicy w długości porównywanych łańcuchów.

Przykład użycia:

C++

1

2

3

4

5

6

7

8

string lancuch1("Jurek");

string lancuch2("Maks");

string lancuch3("Maksymilian");

cout << "Jurek vs Maksymilian: " << lancuch1.compare(lancuch3) << endl; // -1

cout << "Maksymilian vs Jurek: " << lancuch3.compare(lancuch1) << endl; // 1

cout << "Jurek vs Jurek: " << lancuch1.compare(lancuch1) << endl; // 0

cout << "Maks vs Maksymilian: " << lancuch2.compare(lancuch3) << endl; // -7

cout << "Maksymilian vs Maks: " << lancuch3.compare(lancuch2) << endl; // 7

.substr(size_t pos=0, size_t n = npos) – funkcja zwraca łańcuch znaków począwszy od indeksu pos o długości n, generowany na podstawie obiektu. Przykład użycia:

C++

1

2

3

4

string lancuch("Dla myslacych zero-jedynkowo");

cout << lancuch.substr(0,13) << endl; // Dla myslacych

cout << lancuch.substr(14) << endl; // zero-jedynkowo

Podsumowanie

Na ten moment to wszystko ode mnie. Klasa String ma bardzo wiele do zaoferowania dlatego zapraszam do zapoznania się z dokumentacją LINK. Jeżeli chcesz zgłębić wiedzę dotyczącą języka C++, polecam Ci również zapoznanie się z tą książką:

Metody klasy String C++ - Binarnie.pl (2024)

FAQs

Co robi string w C++? ›

W języku C++ zdefiniowana jest klasa string, dostępna po dołączeniu pliku nagłówkowego string. Pozwala ona na tworzenie napisów i manipulowanie nimi łatwiej i bezpieczniej niż dla C-napisów.

Jak sprawdzić długość stringa C++? ›

Sprawdzamy długość tekstu

Jak widać, wywołanie funkcji length(), znajdującej się wewnątrz klasy string spowodowało wypisanie długości zmiennej z której nastąpiło wywołanie.

Do czego służy string? ›

„String” jest angielskim słowem, które na język polski możemy przetłumaczyć na kilka sposobów, jako: „ciąg znaków”, „łańcuch znaków”, „łańcuch”. Jest to tekstowy typ danych, który służy do przechowywania ciągu znaków i. Zaczyna się oraz kończy od cudzysłowu.

Czym się różni string od char? ›

Taka, że char to znak, a string to ciąg(łańcuch) znaków.

Jak zamienić string na char? ›

Konwersja ze String na char jest trywialna, bo mamy dostępną metodę charAt() w klasie String.

Top Articles
Latest Posts
Article information

Author: Nathanial Hackett

Last Updated:

Views: 5863

Rating: 4.1 / 5 (72 voted)

Reviews: 95% of readers found this page helpful

Author information

Name: Nathanial Hackett

Birthday: 1997-10-09

Address: Apt. 935 264 Abshire Canyon, South Nerissachester, NM 01800

Phone: +9752624861224

Job: Forward Technology Assistant

Hobby: Listening to music, Shopping, Vacation, Baton twirling, Flower arranging, Blacksmithing, Do it yourself

Introduction: My name is Nathanial Hackett, I am a lovely, curious, smiling, lively, thoughtful, courageous, lively person who loves writing and wants to share my knowledge and understanding with you.