Programowanie i algorytmy

string

powrót

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: strcmpnatomiast w omawianym podejściu wystarczy użyć operatora porównującego dwa obiekty: ==.

Inicjacja obiektu

Ż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: 

__________

 Wczytywanie

Do wczytywania ciągów możemy użyć dwóch metod, w zależności od potrzeb:

  • obiektem cin oraz operatorem >>, który wczytuje jedno słowo
  • getline(cin, string); wczytanie całego wiersza wraz z białymi znakami

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;
}
 
 

 

Dostęp do poszczególnych znaków 

Pierwszy znak jest przechowywany w komórce o numerze 0, drugi o numerze 1, ostatni o numerze {tex}n-1{/tex}, gdzie {tex}n{/tex} 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;
}
 

 

Korzystanie z wbudowanych metod

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;
}
 

 

Użyteczne funkcje (metody)

Do dyspozycji mamy szereg użytecznych metod operujących na ciągach znaków. Oto niektóre z nich:

Przeciążone operatory

  • == - porównanie dwóch stringów
  • += - konkatenacja dwóch stringów (złączenie jednego stringa z drugim
  • = - przypisanie
  • + - dodawanie stringów
  • [] - odwołanie się do konkretnego znaku w stringu