Klasa string

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 8486 razy

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:

Propozycje książek