C++/String
String
[edytuj]Łańcuchy znaków w stylu języka C są częstą przyczyną błędów programu, a na dodatek ich używanie jest dosyć kłopotliwe. Nic więc dziwnego, że biblioteka standardowa posiada zaimplementowaną uogólnioną klasę napisów zwaną string. Taka klasa daje jednolity, niezależny od systemu i bezpieczny interfejs do manipulowania napisami.
Aby móc korzystać z klasy string należy dołączyć plik nagłówkowy:
#include <string>
Tworzenie nowych obiektów tego typu wygląda następująco:
string napis1;
napis1 = "text";
//inicjalizowanie łańcucha znaków w miejscu jego tworzenia
//jawne wywołanie konstruktora
string napis2( "text" );
//operator przypisania
string napis3 = "text"; // string nie jest zakończony znakiem null, jak w przypadku C-stringa
cout << napis1 << endl
<< napis2 << endl
<< napis3 << endl;
string napis4(10,'X');
cout << napis4;
Uwaga:
Aby kompilator widział typ string, należy powiadomić go w jakiej przestrzeni nazw ten typ się znajduje:
using std::string;
lub ogólnie:
using namespace std;
Klasa string ma zdefiniowanych wiele operatorów, co ułatwia niektóre działania na napisach. Dla przykładu, dawniej aby skopiować napis z jednej zmiennej do drugiej, trzeba było używać dodatkowej funkcji strcpy(). W przypadku klasy string wystarczy operator przypisania '=' :
string a, b;
a = '1';
b = '2';
a = b;
cout << a;
Możemy z powodzeniem używać także operatorów: ==, !=, +, <, > oraz indeksowego []:
string a,b,c;
a = "gosia";
b = "iza";
c = "gosia";
// porównywanie napisów
if (a == c) cout << "a i c sa takie same\n";
if (a != b) cout << "a i b sa rozne\n" ;
// porządek leksykograficzny
cout << "napis a ("<<a<<") poprzedza napis b("<<b<<"): ";
if (a < b) cout << "prawda\n";
else cout << "nieprawda\n";
// łączenie łańcuchów
a = "mal"+ a;
cout << "napis a ("<<a<<") poprzedza napis b("<<b<<"): ";
if (a < b) cout << "prawda\n";
else cout << "nieprawda\n";
// modyfikacja
b[0] = '_';
cout << "zmieniony wyraz b: "<<b<<'\n';
Po czym w konsoli zobaczymy:
a i c sa takie same a i b sa rozne napis a (gosia) poprzedza napis b(iza): prawda napis a (malgosia) poprzedza napis b(iza): nieprawda zmieniony wyraz b: _za
Jak widać, manipulacje obiektami string są intuicyjne. Oprócz wygodnych w stosowaniu operatorów, klasa string posiada jeszcze więcej metod.
Metoda | Opis |
---|---|
empty() | Zwraca wartość true jeżeli napis jest pusty. |
size(),length() | Zwraca ilość znaków w napisie. |
at() | Zwraca znak o podanym położeniu, tak jak operator [], z tym że ta metoda jest bezpieczniejsza - wyrzuca wyjątek w przypadku wyjścia poza zakres stringa. |
clear() | Usuwa wszystkie znaki z napisu. |
erase(...) | Usuwa wybrane znaki. |
find(...) | Znajduje podciąg w ciągu, są też bardziej rozbudowane funkcje tego typu. |
swap(...) | Zamienia miejscami dwa stringi, a staje się b, a b staje się a. |
substr(...) | Zwraca podciąg na podstawie indeksu początkowego i długości podciągu. |
append(...) | Dodaje zadany napis na końcu istniejącego ciągu. |
c_str() | Zwraca napis w stylu języka C (stały wskaźnik typu const char*). |
W przygotowaniu: omówić wymienione wyżej metody |
Omówione dotychczas operatory i metody to tylko część dostępnych; wymienione zostały tylko te najczęściej używane. Teraz przedstawię różnice jakie występują między C a C++ w obsłudze napisów. Po lewej zmienne a i b są typu (const char *), a po prawej - (std::string).
C | C++ |
---|---|
strcpy(a,b) | a = b |
!strcmp(a,b) | a == b |
strcat(a,b) | a += b |
strlen(a) | a.size(), a.length() |
strstr(a,b) | a.find(b) |