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

Z Wikibooks, biblioteki wolnych podręczników.
< C++
Usunięta treść Dodana treść
Nie podano opisu zmian
Nie podano opisu zmian
 
Linia 4: Linia 4:


Aby móc korzystać z klasy <tt>string</tt> należy dołączyć plik nagłówkowy:
Aby móc korzystać z klasy <tt>string</tt> należy dołączyć plik nagłówkowy:
<source lang="cpp">
<syntaxhighlight lang="cpp">
#include <string>
#include <string>
</syntaxhighlight>
</source>


Tworzenie nowych obiektów tego typu wygląda następująco:
Tworzenie nowych obiektów tego typu wygląda następująco:
<source lang="cpp">
<syntaxhighlight lang="cpp">
string napis1;
string napis1;
napis1 = "text";
napis1 = "text";
Linia 26: Linia 26:
cout << napis4;
cout << napis4;
</syntaxhighlight>
</source>


Uwaga:<br />
Uwaga:<br />
Aby kompilator widział typ <tt>string</tt>, należy powiadomić go w jakiej przestrzeni nazw ten typ się znajduje:
Aby kompilator widział typ <tt>string</tt>, należy powiadomić go w jakiej przestrzeni nazw ten typ się znajduje:


<source lang="cpp">using std::string;</source>
<syntaxhighlight lang="cpp">using std::string;</syntaxhighlight>


lub ogólnie:
lub ogólnie:


<source lang="cpp">using namespace std;</source>
<syntaxhighlight lang="cpp">using namespace std;</syntaxhighlight>


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 <tt>strcpy()</tt>. W przypadku klasy <tt>string</tt> wystarczy operator przypisania '=' :
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 <tt>strcpy()</tt>. W przypadku klasy <tt>string</tt> wystarczy operator przypisania '=' :
<source lang="cpp">
<syntaxhighlight lang="cpp">
string a, b;
string a, b;
a = '1';
a = '1';
Linia 44: Linia 44:
a = b;
a = b;
cout << a;
cout << a;
</syntaxhighlight>
</source>
Możemy z powodzeniem używać także operatorów: ==, !=, +, <, > oraz indeksowego []:
Możemy z powodzeniem używać także operatorów: ==, !=, +, <, > oraz indeksowego []:
<source lang="cpp">
<syntaxhighlight lang="cpp">
string a,b,c;
string a,b,c;
a = "gosia";
a = "gosia";
Linia 74: Linia 74:


cout << "zmieniony wyraz b: "<<b<<'\n';
cout << "zmieniony wyraz b: "<<b<<'\n';
</syntaxhighlight>
</source>


Po czym w konsoli zobaczymy:
Po czym w konsoli zobaczymy:

Aktualna wersja na dzień 18:58, 9 lut 2021

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*).

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)