C++/String: Różnice pomiędzy wersjami

Z Wikibooks, biblioteki wolnych podręczników.
< C++
Usunięta treść Dodana treść
zamiana ProstaNawigacja->Subst:Naw
Linia 23: Linia 23:
cout << napis4;
cout << napis4;

Uwaga:
Aby kompilator widział typ "string" należy powiadomić go, w jakiej przestrzeni nazw ten typ się znajduje, np. w ten sposób:

<code>using namespace std;</code>



Powyższy kod da w wyniku:
Powyższy kod da w wyniku:

Wersja z 18:20, 22 maj 2008

String

Napisy w stylu języka C są częstą przyczyną błędów a na dodatek ich używanie jest dosyć kłopotliwe. Nic wiec 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>

Tworzyć nowe obiekty tego typu możemy następująco:

string napis1;
napis1 = "text";

string napis2( "text" );
    
string napis3 = "text";
    
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, np. w ten sposób:

using namespace std;


Powyższy kod da w wyniku:

text
text
text
XXXXXXXXXX

Klasa string ma zdefiniowanych bardzo wiele operatorów, co ułatwia niektóre działania na napisach. Dla przykładu dawniej aby skopiować napis do innego z napisu trzeba było używać funkcji strcpy(). W implementacji klasy string wystarczy operator przypisania '=' :

string a, b;
a = '1';
b = '2';
a = b;
cout << a;

Mamy też takie operatory jak ==, !=, + i indeksowy []:

string a,b,c;
a = "Europa";
b = "Afryka";
c = "Europa";
    
if (a == c)
    cout << "takie same\n";
        
if (a > b)
    cout << "napis a jest wiekszy\n";
else
    cout << "napis a nie jest wiekszy\n";
       
b = b + 'a';
    
if (a > b)
    cout << "napis a jest wiekszy\n";
else
    cout << "napis a nie jest wiekszy\n";
    
if (a != b)
    cout << "rozne\n" ;
        
b[0] = '_';
    
cout << b;

Po czym w konsoli zobaczymy:

takie same
napis a jest wiekszy
napis a jest wiekszy
rozne
_frykaa

Jak widać manipulacje obiektami string są bardzo wygodne. Oprócz wygodnych w stosowaniu operatorów klasa string posiada jeszcze więcej metod.

MetodaOpis
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, podobnie jak operator [] z tym że ta metoda jest bezpieczniejsza, zapobiega wyjściu poza zakres.
clear(),erase()Usuwa wszystkie znaki z napisu, erase() może usuwać wybrane znaki.
find()Znajduje podciąg w ciągu, są też bardziej rozbudowane funkcje tego typu.
swap()Zamienia miejscami dwa stringi, a staje sie b, a b staje sie a.
append()Dodaje zadany napis na końcu istniejącego ciągu.
c_str()Zwraca napis w stylu języka C (stały wskaźnik do pierwszego elementu).

Omówione dotychczas operatory i metody to tylko część dostępnych, tu wymieniłem tylko te najczęściej używane. Teraz przedstawię różnice jakie występują między bibliotekami C a C++ w obsłudze napisów.

CC++
strcpy(a,b) a = b
strcmp(a,b) a == b
strcat(a,b) a += b
strlen(a) a.size()
strstr(a,b) a.find(b)