Klasa string

Stronę tą wyświetlono już: 275 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:

Listing 1
  1. #include <iostream>
  2. #include <string>
  3. #include <windows.h>
  4. using namespace std;
  5. int main(){
  6. string name;
  7. string surname;
  8. cout<<"Podaj swoje imie: ";
  9. cin>>name; // wczytywanie danych do obiektu klasy string dzięki przeciążeniu operatora >>
  10. cout<<"Podaj swoje nazwisko: ";
  11. cin>>surname; // wczytywanie danych
  12. cout<<endl<<endl<<"Twoje nazwisko i imie: "<<surname<<" "<<name; // tutaj jest wypisywanie tekstu na ekranie dzięki przeciążeniu operatora <<
  13. string surnameAndName = surname; // podstawianie
  14. surnameAndName += " "; // dodawanie
  15. surnameAndName += name; // dodawanie tekstu z zmiennej typu string
  16. cout<<endl<<endl<<"Twoje nazwisko i imie (w jednej zmiennej): "<<surnameAndName; // wypisywanie
  17. string::size_type i = surnameAndName.find(" ",0); // szukanie pierwszego wystąpienia znaku spacji
  18. if(i != string::npos){
  19. string surname2;
  20. string name2;
  21. surname2.insert(0, // miejsce wstawienia (pozycja 0)
  22. surnameAndName.c_str(), // wstawiany ciąg znaków const char* wyciągnięty z zmiennej surnameAndName za pomocą metody c_str()
  23. i // liczba wstawianych znaków
  24. ); // ta metoda wstawia w określonym miejscu łańcucha znaków zmiennej surname2 i znaków zawartych w podanej zmiennej łańcuchowej const char*
  25. name2.insert(0, // miejsce wstawienia
  26. surnameAndName.c_str() + i // wskaźnik stałego ciągu znaków const char* przesunięty o i znaków
  27. ); // ta metoda wstawia w określonym miejscu łańcucha znoków zmiennej name2 podany ciąg znaków
  28. surname2.clear(); // usuwa tekst z zmiennej surname2
  29. surname2.insert(surname2.begin(), // wskaźnik do początku łańcucha znaków surname2
  30. surnameAndName.begin(), // wskaźnik do początka listy surnameAndName
  31. surnameAndName.begin() + i // wskaźnik do i - tego elementu zawartego w liście surnameAndName
  32. ); // wstawia do zmiennej surname w miejscu wskazania elementy z zmiennej surnameAndName zaczynając od początekowego adresu wskazania po końcowy adres wskazania
  33. cout<<endl<<endl<<"Wyciagniete imie: "<< name2 <<" i nazwisko: "<< surname2;
  34. }
  35. string tekst_koncowy = "Wcisnij enter, aby zamknac program...";
  36. cout<<endl<<endl;
  37. for(int i = 0; i < tekst_koncowy.size() /* metoda size zwraca mi liczbę znaków zawartych w obiekcie */; i++){
  38. cout<<tekst_koncowy[i]; // tak odwołuję się do poszczególnych elementów listy
  39. Sleep(50); // ta funkcja spowoduje odczekanie 50 ms przed przystąpieniem do realizacji reszty programu
  40. }
  41. cin.get();
  42. return 0;
  43. }

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:

Listing 2
  1. void ParseString(string str_to_parse, vector<string> &tString){
  2. if(tString.size()){
  3. tString.clear(); // czyszczę tablicę, jeżeli ta zawiera jakieś elementy
  4. }
  5. char parse_signs[] = "-+*()/="; // a tutaj znaki, względem których dziabany tekst będzie
  6. string::size_type sizeBegin = 0; // początkowy indeks przeszukiwania
  7. string::size_type sizeEnd = str_to_parse.find_first_of(parse_signs, sizeBegin); // tu szukam wystąpienia jednego z podanych znaków
  8. while(sizeEnd != string::npos){ // dopóki funkcja find_first_of znajduje dany znak w ciągu znaków string to
  9. if(sizeEnd != sizeBegin){
  10. tString.push_back(
  11. str_to_parse.substr(sizeBegin, sizeEnd - sizeBegin) // wydziabój tekst spomiędzy operatorów
  12. ); // i wrzucaj go do wora, znaczy się kontenera
  13. }
  14. tString.push_back(
  15. str_to_parse.substr(sizeEnd,1) // i wydziabój operator
  16. ); // po czym wrzucaj do wora, znaczy się kontenera
  17. sizeBegin = sizeEnd + 1; // przypisuj zmiennej zmiennej początku adres końca zwiększony o 1
  18. sizeEnd = str_to_parse.find_first_of(parse_signs, sizeBegin); // znajduj nowe wystąpienie jednego ze znaków
  19. };
  20. if(sizeBegin < str_to_parse.size()){ // a to gdy końcówka została do wydziabania
  21. tString.push_back(
  22. str_to_parse.substr(sizeBegin) // wydziabóję końcówkę
  23. ); // i dawaj do wora
  24. }
  25. }

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 *
assignprzypisuje ciąg znaków podanych w postaci wskaźnika const char *
atzwraca referencje do elementu o podanym indeksie
beginzwraca wskaźnik do pierwszego elementu
c_strzwraca ciąg znaków jako const char* będący tekstem zawartym wewnątrz obiektu klasy string
capacityzwraca największą liczbę elementów, jakie mogłyby zostać przechowane w ciągu znaku bez zwiększania zajmowanego obszaru pamięci
clearczyści listę;
compareporównuje dwa ciągi znaków, jeżeli różnicy nie ma to zwraca zero
copykopiuje dane do zmiennej typu const char *
_Copy_snowsza wersja poprzedniej metody (bardziej zalecana)
datakonwertuje zawartość stringa w tablicę znaków const char*
emptysprawdza, czy zawiera jakieś znaki
endzwraca wskaźnik do końca listy
eraseusuwa dany element, lub zakres elementów z listy znaków
findprzeszukuje tekst w poszukiwaniu wystąpienia podanego wzorca
find_first_not_ofprzeszukiwanie tekstu w poszukiwaniu wystąpienia pierwszego znaku, który nie pasuje do wzorca
find_first_ofprzeszukiwanie tekstu w poszukiwaniu wystąpienia pierwszego znaku, który pasuje do wzorca
find_last_not_ofprzeszukiwanie tekstu od końca w poszukiwaniu wystąpienia znaku, który nie pasuje do wzorca
find_last_ofprzeszukiwanie tekstu od końca w poszukiwaniu wystąpienia znaku, który pasuje do wzorca
insertwstawia określoną liczbę elementów w określonym miejscu listy
lengthzwraca bieżącą liczbę elementów zawartych w stringu
max_sizezwraca maksymalną liczbę znaków, jakie string może zawierać
push_backwstawia znak na koniec stringa
replacezastępuje wskazany zakres znaków podanym nowym zakresem znaków
rfindprzeszukuje tekst od tyłu w poszukiwaniu wystąpienia w tekście podanego ciągu znaków
sizezwraca bieżącą liczbę elementów w stringu
substrkopiuje określony wycinek stringa
swapzamienia zawartość dwóch stringów miejscami

Komentarze