Klasa string jest listą przystosowaną do przechowywania i operowania na zmiennych tekstowych. Dzięki tej klasie znacznie łatwiej wykonuje się operacje wczytywania danych z klawiatury, jak również znacznie ułatwione zostało łączenie tekstów w jedną całość. Klasa dysponuje szeregiem funkcji, które można wykorzystać do przetwarzania tekstu zawartego w obiekcie tejże klasy.
Na dobry początek zacznę od zademonstrowania najczęściej wykorzystywanych metod i operatorów tejże klasy, z której można korzystać po załączeniu pliku string:
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
int main(){
string name;
string surname;
cout<<"Podaj swoje imie: ";
cin>>name; // wczytywanie danych do obiektu klasy string dzięki przeciążeniu operatora >>
cout<<"Podaj swoje nazwisko: ";
cin>>surname; // wczytywanie danych
cout<<endl<<endl<<"Twoje nazwisko i imie: "<<surname<<" "<<name; // tutaj jest wypisywanie tekstu na ekranie dzięki przeciążeniu operatora <<
string surnameAndName = surname; // podstawianie
surnameAndName += " "; // dodawanie
surnameAndName += name; // dodawanie tekstu z zmiennej typu string
cout<<endl<<endl<<"Twoje nazwisko i imie (w jednej zmiennej): "<<surnameAndName; // wypisywanie
string::size_type i = surnameAndName.find(" ",0); // szukanie pierwszego wystąpienia znaku spacji
if(i != string::npos){
string surname2;
string name2;
surname2.insert(0, // miejsce wstawienia (pozycja 0)
surnameAndName.c_str(), // wstawiany ciąg znaków const char* wyciągnięty z zmiennej surnameAndName za pomocą metody c_str()
i // liczba wstawianych znaków
); // ta metoda wstawia w określonym miejscu łańcucha znaków zmiennej surname2 i znaków zawartych w podanej zmiennej łańcuchowej const char*
name2.insert(0, // miejsce wstawienia
surnameAndName.c_str() + i // wskaźnik stałego ciągu znaków const char* przesunięty o i znaków
); // ta metoda wstawia w określonym miejscu łańcucha znoków zmiennej name2 podany ciąg znaków
surname2.clear(); // usuwa tekst z zmiennej surname2
surname2.insert(surname2.begin(), // wskaźnik do początku łańcucha znaków surname2
surnameAndName.begin(), // wskaźnik do początka listy surnameAndName
surnameAndName.begin() + i // wskaźnik do i - tego elementu zawartego w liście surnameAndName
); // wstawia do zmiennej surname w miejscu wskazania elementy z zmiennej surnameAndName zaczynając od początekowego adresu wskazania po końcowy adres wskazania
cout<<endl<<endl<<"Wyciagniete imie: "<< name2 <<" i nazwisko: "<< surname2;
}
string tekst_koncowy = "Wcisnij enter, aby zamknac program...";
cout<<endl<<endl;
for(int i = 0; i < tekst_koncowy.size() /* metoda size zwraca mi liczbę znaków zawartych w obiekcie */; i++){
cout<<tekst_koncowy[i]; // tak odwołuję się do poszczególnych elementów listy
Sleep(50); // ta funkcja spowoduje odczekanie 50 ms przed przystąpieniem do realizacji reszty programu
}
cin.get();
return 0;
}
Metoda find zwraca pozycję pierwszego wystąpienia danego ciągu znaków w bieżącym obiekcie klasy typu string, gdzie przeszukiwanie rozpoczyna się od podanego indeksu przeszukiwania. Zwracana wartość jest liczbą typu std::string::size_type i gdy jej wartość jest równa stałej std::string::npos, wtedy wiadomo, że program nie znalazł żadnego wystąpienia danego ciągu znaków w bieżącym obiekcie klasy typu string.
Bardzo podobną rolę odgrywają metody find_first_of, find_first_not_of, find_last_of i find_last_not_of, z tą tylko różnicą, że znajdują one licząc od początku lub końca listy pierwsze wystąpienie jednego z wymienionych lub nie wymienionego znaku w podanym ciągu znaków. Oto bardzo prosta funkcja do parsowania tekstu, jako prosty przykład zastosowania metody find_first_of:
void ParseString(string str_to_parse, vector<string> &tString){
if(tString.size()){
tString.clear(); // czyszczę tablicę, jeżeli ta zawiera jakieś elementy
}
char parse_signs[] = "-+*()/="; // a tutaj znaki, względem których dziabany tekst będzie
string::size_type sizeBegin = 0; // początkowy indeks przeszukiwania
string::size_type sizeEnd = str_to_parse.find_first_of(parse_signs, sizeBegin); // tu szukam wystąpienia jednego z podanych znaków
while(sizeEnd != string::npos){ // dopóki funkcja find_first_of znajduje dany znak w ciągu znaków string to
if(sizeEnd != sizeBegin){
tString.push_back(
str_to_parse.substr(sizeBegin, sizeEnd - sizeBegin) // wydziabój tekst spomiędzy operatorów
); // i wrzucaj go do wora, znaczy się kontenera
}
tString.push_back(
str_to_parse.substr(sizeEnd,1) // i wydziabój operator
); // po czym wrzucaj do wora, znaczy się kontenera
sizeBegin = sizeEnd + 1; // przypisuj zmiennej zmiennej początku adres końca zwiększony o 1
sizeEnd = str_to_parse.find_first_of(parse_signs, sizeBegin); // znajduj nowe wystąpienie jednego ze znaków
};
if(sizeBegin < str_to_parse.size()){ // a to gdy końcówka została do wydziabania
tString.push_back(
str_to_parse.substr(sizeBegin) // wydziabóję końcówkę
); // i dawaj do wora
}
}
Powyższa funkcja wykorzystuje w przebiegły sposób metodę find_first_of, w podobny sposób jednak można by stworzyć funkcję, która wykorzystywałaby jedną z wcześniej wymienionych metod przeznaczonych do przeszukiwania tekstu w poszukiwaniu określonych znaków.
Poniżej zamieszczam listę metod klasy typu string: