Biblioteka string odpowiedzialna jest za obiektowe podejście do ciągów znaków. Korzystanie z niej jest wygodniejsze niż ze standardowej obsługi tablicy znaków (char *). Na przykład, jeśli chcemy określić liczbę znaków w napisie, to w standardowym podejściu musimy "puścić pętlę", która nam je zliczy. W obiekcie klasy string tą informację mamy już zapisaną i możemy "wyciągnąć" za pomocą metody size().
Dodatkowo programowanie obiektowe umożliwia nam przeciążanie operatorów. Oznacza to, że nie musimy martwić się niektórymi operacjami takimi jak porównywanie dwóch ciągów czy ich sklejanie.
Dla przykładu można się posłużyć porównywaniem napisów. Aby sprawdzić, czy dwa ciągi są równe zapisane w zwykłych tablicach znaków, musimy użyć do tego specjalnej funkcji: strcmp, natomiast w omawianym podejściu wystarczy użyć operatora porównującego dwa obiekty: ==.
Żeby korzystać z dobrodziejstw klasy string dodajemy nagłówek:
#include <string>
Aby móc korzystać z typu obsługującego ciągi znaków musimy go najpierw zainicjować. Inicjacja wygląda identycznie jak przy tworzeniu zwykłych zmiennych. Nazwa typu, jaki należy podać to oczywiście string:
int x; //tworzenie zwykłej zmiennej
string y; //tworzenie zmiennej typu string
Przy tworzeniu zmiennej typu string można od razu nadać ciąg początkowy. Przekazujemy go poprzez konstruktor klasy string:
#include <iostream>
#include <string>
using namespace std;
int main() {
string ciag("Ola ma kota");
string ciag_drugi(ciag);
cout<<ciag<<endl<<ciag_drugi;
cin.get();
return 0;
}
Na wyjściu pojawi się dwa razy "Ola ma kota".
Można także wypełnić wartość obiektu string danym znakiem np.:
#include <iostream>
#include <string>
using namespace std;
int main() {
string ciag(10, '_'); //wstawienie 10 razy znak _
cout<<ciag;
cin.get();
return 0;
}
Wyjście:
__________
Do wczytywania ciągów możemy użyć dwóch metod, w zależności od potrzeb:
Przykłady:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a;
cin>>a; //wczytanie jednego wyrazu
cout<<a<<endl; //wypisanie go na ekranie
cin.ignore(); //wyczyszczenie bufora
getline(cin, a); //wczytanie całego wiersza
cout<<a; //i wypisanie go na ekranie
cin.get();
return 0;
}
Pierwszy znak jest przechowywany w komórce o numerze 0, drugi o numerze 1, ostatni o numerze $$n-1$$, gdzie $$n$$ to liczba znaków w ciągu. Ta zasada obowiązuje także w zwykłych tablicach.
#include <iostream>
#include <string>
using namespace std;
int main() {
string ciag;
cout<<<"Podaj wyraz: ";
cin>>ciag; //np. lokomotywa
cout<<ciag[0]<<endl; //wypisanie pierwszej litery
cout<<ciag[ciag.size()-1]; //wypisanie ostatniej litery
cin.get();
return 0;
}
Do odwoływania się do poszczególnych metod udostępnianych przez klasę string służy operator kropki ".". Na przykład, jeśli chcemy dowiedzieć się z ilu znaków składa się podany ciąg, użyjemy metody size() np. :
#include <iostream>
#include <string>
using namespace std;
int main() {
string ciag;
cout<<"Podaj wyraz: "; //np. lokomotywa
cin>>ciag;
cout<<"Twój wyraz składa się z "<<ciag.size()<<" znaków";
cin.get();
return 0;
}
Do dyspozycji mamy szereg użytecznych metod operujących na ciągach znaków. Oto niektóre z nich:
Przeciążone operatory