String

JaskMar
Artykuł został umieszczony na liście [[Zalazki artykulow|Zalążków artykułów]]. Jeżeli możesz rozbuduj go!

Stringi w stylu C

Łańcuch znaków to inaczej string. Jest to tablica zmiennych typu char. Pod koniec każdego stringu jest znak NULL, czyli bajt zerowy. Każde słowo może byś stringiem. Na przykład "Programowanie" to string składający się z 14 znaków (mimo że to słowo jest 13-literowe, pamiętamy o końcowym znaku NULL). Definicja stringu może mieć dwie postacie:

char jakis_string[14];

Lub taką, gdzie kompilator sam obliczy, ile ma mieć znaków:

char inny_string[] = { "Programowanie" };

Ten drugi sposób stosuje się najczęściej ze słowem kluczowym const (String stały), ponieważ nie może on pomieścić więcej niż 13 znaków + NULL, a w pierwszym przypadku możemy to sami określić. Możliwy jest także zapis:

char trzeci_string [14]= { "Programowanie" };

Gdybyśmy jednak w tym przypadku w nawiasie kwadratowym napisali nie 14, tylko 13 to nie byłby błąd, ale taki string mógłby wyglądać np. tak: Programowanie#jdi*'. Dlaczego? Dlatego, że nie zostawiliśmy miejsca na znak NULL, a string musi się tak kończyć. W takim razie czytał z pamięci RAM naszego komputera dalsze bajty, interpretując je jako znaki, dopóki gdzieś nie natknie się na znak NULL. Nasza pamięć RAM ma pełno znaków NULL, więc nie powinno się dodać tych przypadkowych znaków dużo. Dlatego:

Zawsze rezerwuj na string o jeden bajt więcej, niż ma słowo w nim zawarte. (Bo 1 znak = 1 bajt)

Stringi w stylu C++

Jeżeli masz w miarę solidny kompilator C++ zgodnym ze standardem ISO, to powinieneś mieć dostępną m.in. klasę string, bardzo ułatwiającą operowanie na tekście.

#include <string>
#include <iostream>

int main (int argc, char *argv[])
{
    std::string str = "Łańcuch w stylu C++";

    std::cout << str << std::endl;

    return 0;
}

Klasa std::string dostarcza metod zastępujących funkcje operujące na łańcuchach w stylu C (te można teraz znaleźć w bibliotece Cstring). Zawiera również przeciążenia operatorów, które pozwalają na jej bardziej naturalne używanie:

a = b zastępuje Strcpy
a == b zastępuje Strcmp
a += b zastępuje Strcat
a.size() zastępuje Strlen
a.find() zastępuje Strstr

#include <string>
#include <iostream>

int main (int argc, char *argv[])
{
    using namespace std;

    string a = "jeden ";
    string b = "dwa ";

    if (a == b)
        cout << "Łańcuchy są takie same" << endl;
    else
        cout << "Łańcuchy są różne" << endl;

    std::string c;

    if (a > b)
        cout << "Łańcuch a jest dłuższy, ma " << a.size() << " znaków." << endl;
    else
        cout << "Łańcuch b jest dłuższy, ma " << b.size() << " znaków." << endl;

    c = a + b;

    cout << "Oba łańcuchy mają razem " << c.size() << " znaków." << endl;
    return 0;
}

Łańcuchy są różne
Łańcuch a jest dłuższy, ma 6 znaków.
Oba łańcuchy mają razem 10 znaków.

Podobnie jak w przypadku tablic znakowych, możliwe jest też pobranie znaku ze string'a, dzięki przeciążonemu operatorowi [] lub metodzie at().

#include <string>
#include <iostream>

int main (int argc, char *argv[])
{
    std::string a = "4programmers";

    std::cout << "pierwszy: " << a[0] << std::endl;
    std::cout << "drugi: " << a.at(1) << std::endl;
}

pierwszy: 4
drugi: p

Dokladniejszy opis tej klasy można znaleźć w encyklopedii STL'a:
std::string

0 komentarzy