Klasa string
Stronę tą wyświetlono już: 6248 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:
append | dodaje ciąg znaków podanych w postaci wskaźnika const char * | |
assign | przypisuje ciąg znaków podanych w postaci wskaźnika const char * | |
at | zwraca referencje do elementu o podanym indeksie | |
begin | zwraca wskaźnik do pierwszego elementu | |
c_str | zwraca ciąg znaków jako const char* będący tekstem zawartym wewnątrz obiektu klasy string | |
capacity | zwraca największą liczbę elementów, jakie mogłyby zostać przechowane w ciągu znaku bez zwiększania zajmowanego obszaru pamięci | |
clear | czyści listę; | |
compare | porównuje dwa ciągi znaków, jeżeli różnicy nie ma to zwraca zero | |
copy | kopiuje dane do zmiennej typu const char * | |
_Copy_s | nowsza wersja poprzedniej metody (bardziej zalecana) | |
data | konwertuje zawartość stringa w tablicę znaków const char* | |
empty | sprawdza, czy zawiera jakieś znaki | |
end | zwraca wskaźnik do końca listy | |
erase | usuwa dany element, lub zakres elementów z listy znaków | |
find | przeszukuje tekst w poszukiwaniu wystąpienia podanego wzorca | |
find_first_not_of | przeszukiwanie tekstu w poszukiwaniu wystąpienia pierwszego znaku, który nie pasuje do wzorca | |
find_first_of | przeszukiwanie tekstu w poszukiwaniu wystąpienia pierwszego znaku, który pasuje do wzorca | |
find_last_not_of | przeszukiwanie tekstu od końca w poszukiwaniu wystąpienia znaku, który nie pasuje do wzorca | |
find_last_of | przeszukiwanie tekstu od końca w poszukiwaniu wystąpienia znaku, który pasuje do wzorca | |
insert | wstawia określoną liczbę elementów w określonym miejscu listy | |
length | zwraca bieżącą liczbę elementów zawartych w stringu | |
max_size | zwraca maksymalną liczbę znaków, jakie string może zawierać | |
push_back | wstawia znak na koniec stringa | |
replace | zastępuje wskazany zakres znaków podanym nowym zakresem znaków | |
rfind | przeszukuje tekst od tyłu w poszukiwaniu wystąpienia w tekście podanego ciągu znaków | |
size | zwraca bieżącą liczbę elementów w stringu | |
substr | kopiuje określony wycinek stringa | |
swap | zamienia zawartość dwóch stringów miejscami |

Tytuł:
Architektura oprogramowania bez tajemnic. Wykorzystaj język C++ do tworzenia wydajnych aplikacji i systemów
Autor:
Adrian Ostrowski, Piotr Gaczkowski

Tytuł:
Opus magnum C++ 11. Programowanie w języku C++. Wydanie II poprawione (komplet)
Autor:
Jerzy Grębosz

Tytuł:
Programowanie wieloplatformowe z C++ i wxWidgets 3
Autor:
Bartosz W. Warzocha

Tytuł:
Język C++ i przetwarzanie współbieżne w akcji. Wydanie II
Autor:
Anthony Williams

Tytuł:
C++ dla bystrzaków. Wydanie VII
Autor:
Stephen R. Davis

Tytuł:
Tablice informatyczne. Podstawy C++
Autor:
Radosław Sokół

Tytuł:
Opus magnum C++11. Programowanie w języku C++ (komplet)
Autor:
Jerzy Grębosz

Tytuł:
OpenCV 3. Komputerowe rozpoznawanie obrazu w C++ przy użyciu biblioteki OpenCV
Autor:
Adrian Kaehler, Gary Bradski

Tytuł:
C++ w 24 godziny. Wydanie VI
Autor:
Rogers Cadenhead, Jesse Liberty

Tytuł:
C++ Optymalizacja kodu. Sprawdzone techniki zwiększania wydajności
Autor:
Guntheroth Kurt