Kurs maturalny z języka angielskiego!
kurs-maturalny-jezyk-angielski

PROGRAMOWANIE I ALGORYTMY

Zajęcia maturalne z informatyki
Olimpiada Informatyczna Juniorów
    Prowadzący: Marcin Kasprowicz
  • właściciel serwisu algorytm.edu.pl
  • wrzesień 2024 — start zajęć
  • czytaj więcej

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

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