Łańcuchem znaków nazywamy najzwyczajniejszą tablicę typu char. Oto przykładowy łańcuch znaków:

...
char lancuch_znakow[
256
];
...

Kiedyś wspomniałem, że zmienna char oprócz liczb przechowuje także litery. Jak to możliwe? Zaraz wszystko wyjaśnię. Istnieje coś takiego jak kodowanie znaków. Każdy znak(litera) ma swój numer w jakimś systemie znakowym. Dlatego char jest w rzeczwyistości liczbą, ale taka liczba ma swój odpowiednik w znaku. Domyślnie w programie wyświetlają nam się litery, czyli odpowiedniki wartości char w danym systemie znakowym.

TABLICA ASCII

Przykładowym system kodowania znaków, jest system ASCII(American Standard Code for Information Interchange), ten system jest systemem znaków w Windowsie. System ten składa się z 256 znaków(unsigned char).
a) znaki drukowane- są to znaki które są dostępne na klawiaturze i wyświetlane na ekranie. Ich numeracja mieści się w przedziale od 32-127.
b) znaki rozszerzone- znaki, które są rozszerzeniem zwykłych znaków. Zawierają się w przedziale od 128-255
c) znaki sterujące- używa się ich np. w drukarkach, służą do sterowania tekstem, nie mają swoich odpowiedników graficznych.

Na Wikipedii mamy przedstawioną pełną tabelę ASCII.

UŻYWANIE ŁAŃCUCHÓW ZNAKÓW

Łańcuch znaków to tablica typu char, czyli wiele znaków, a wiele znaków to po prostu napis! Łańcuch znaków to zwykły napis. Taką tablicę char(łańcuch znaków) możemy od razu zainicjować:

...
char napis[
12
]=
"Jakis napis"
;
...

Podczas deklaracji napisów należy pamiętać, aby wielkość tablicy mogła pomieścić tyle znaków ile zajmuje napis, dla przykładu w tekście "Jakiś napis" jest 11 znaków(każdy znak trzeba liczyć, nawet spacje, entery), więc minimalna wielkość tablicy, która może pomieścić ten tekst to właśnie 12. Trzeba pamiętać, aby dodać 1 dodatkowy znak na zakończenie tekstu, czyli dla 11 znaków tablica musi być 12 elementowa. Gdy tworzymy łańcuch znaków i od razu inicjujemy go, nie musimy określać długości tablicy, kompilator sam policzy i zrobi to za nas:

...
char napis[]=
"Nie podajemy dlugości tablicy, kompilator policzy ją za nas"
;
...

Wyświetlenie łańcucha znaków w programie:

#include <iostream>


int main(int argc,char* argv[])
{
  char napis[]=
"Nasz napis :P"
;
  std::cout<<napis<<std::endl;
  system(
"PAUSE"
);
  return
0
;
}


Tablicę można zainicjować tylko raz, podczas tworzenia tablicy napis, nie możemy zainicjować istniejącej tablicy! Potem możemy jedynie zmieniać pojedyncze zmienne, czyli litery, zmieńmy sobie jakąś literę:

...
char napis[]=
"Nasz napis"
;
napis[
5
]='t';
...

Elementowi o indeksie 5 w tablicy, przypisujemy literę t, czyli literę 'n' zmieniamy na literę 't', więc teraz łańcuch(napis), będzie przechowywał tekst: "Nasz tapis". Myślę, że zauważyłeś, że inaczej podajemy tekst(np. podczas inicjacji tablicy), a inaczej pojedynczą literę. Łańcuch znaków podajemy między cudzysłowami "a", a pojedynczą literę(zmienną char) podajemy między pojedynczymi cudzysłowami: ' a '. Jak widzisz gdy piszemy, program nie musimy się martwić o systemy kodowania, bo wystarczy podać, że chodzi ci o literę 'K', a kompilator sam znajdzie jej wartość i zapisze jej numer. W rzeczywistości nasz tekst to tablica liczb, ale dzięki kodowaniu, są one wyświetlane jako litery.

ZNAKI SPECJALNE

Tutaj zaprezentuję kilka znaków specjalnych w C++. Znaki specjalne w zapisie składają się z dwóch znaków, pierwszy z nich to \, a drugi zależy od znaku specjalnego.

1) Znak '\n'

Oznacza on przejście do następnej linii, tzw. enter. Już go wcześniej stosowałem w przykładach.

...
char tekst[]=
"Linijka 1\nLinijka 2\nLinijka 3\n\nLinijka 5"
;
...

Taki tekst spowoduje wyświetlenie takiego tekstu:
Linijka 1
Linijka 2
Linijka 3

Linijka5

Każdy znak \n to pojedynczy enter i przechodzimy nim do następnej linijki. Chociaż w zapisie składa się z dwóch znaków, liczymy go jako jeden znak.

2) Znak \r

Oznacza on "skok na początek linii". Raczej nieużywany przy operacjach na ekranie. Jest on używany np. w drukarkach, gdzie aby przejść do następnej linijki należy użyć znaków '\n' i '\r' (zresztą w windowsie też tak zostało).

3) Znak \t

Jest to znak tabulacji poziomej.

4) Znak \v

Jest to znak tabulacji pionowej.

5) Znak \f

W drukarkach ten znak oznacza wysunięcie strony. W niektórych programach konsolowych może oznaczać wyczyszczenie ekranu.

6) Znak \"

\" - gdy chcemy w tekście wstawić znak ", musimy napisać \", bo sam znak " w kodzie źródłowym oznacza początek lub koniec łańcucha znaków.

7) Znak \'

Tak jak wyżej, tyle że ze znakiem '.

8) Znak \\

Sam znak \ oznacza, że wstawiamy znak specjalny, jeżeli chcemy w tekście wstawić znak \ w tekście, musimy użyć znaku specjalnego \\.

ZNAK SPECJALNY \0

Istnieje jeszcze znak \0, stawiamy go, gdy chcemy zakończyć łańcuch znaków. Załóżmy, że piszemy grę i w grze robimy łańcuch znaków, który ma przechowywać nick gracza. Tylko skąd mamy wiedzieć z ilu liter będzie składał się nick takiego gracza? No właśnie z pomocą przychodzi nam znak \0, który w dowolnym miejscu kończy łańcuch znaków. Wcześniej, gdy mówiłem o inicjacji łańcuchów znaków, wspomniałem, że gdy tekst składa się z 11 liter, tablica musi być, co najmniej dwunasto- elementowa. Bierze się to stąd, że KAŻDY ŁAŃCUCH ZNAKÓW MUSI KOŃCZYĆ SIĘ ZNAKIEM \0! Ten 12 element to właśnie znak \0. Gdy inicjujemy łańcuch podczas tworzenia gotowym tekstem, kompilator automatycznie wstawi znak \0, dlatego nie musimy się o niego martwić.

Tworzymy sobie łańcuch znaków długości dziesięciu znaków, jeżeli użytkownik podaje jakiś tekst w programie, to nie wiemy jak długi będzie ten tekst, jeżeli sami z góry nie określimy długości tekstu.

...
char tekst[
10
]=
"ABC"
;
...

Zainicjowaliśmy tablicę, jej pierwszym znakiem jest 'A', drugim 'B', a trzecim 'C', a czwartym właśnie znak '\0', gdyż w tym miejscu kończy się tekst, gdy kompilator natrafi na ten znak automatycznie przestaje odczytywać tekst i pomimo tego, że łańcuch może pomieścić aż 10 znaków, to kompilator odczyta tylko 4. Teraz załóżmy, że chcemy wydłużyć ten tekst o kilka kolejnych literek:

...
tekst[
3
]='D';
tekst[
4
]='E';
tekst[
5
]='F';
tekst[
6
]='G';
tekst[
7
]='H';
tekst[
8
]='/0';
...

Wcześniej w czwartym elemencie był już znak końca tablicy, teraz przestawiliśmy go na ósmy indeks, dzięki temu wydłużyliśmy tekst w łańcuchu o kilka kolejnych liter. Tekst, który jest przetrzymywany w łańcuchu: ABCDEFGH. Pamiętajmy, że nie możemy przekroczyć wielkości tablicy, czyli 10 elementów, czyli w naszym przypadku możemy dodać jeszcze tylko 1 literę.

Funkcja memcpy

A co gdy chcemy zmienić tekst w istniejącej tablicy char? Możemy każdą literę oddzielnie przypisaywać, ale jest to mozolne. Z pomocą przychodzi nam funkcja memcpy(). Jej prototyp:

void* memcpy(void* przeznaczenie,const void* zrodlo,size_t ilosc);

Funkcja ta kopjuje blok pamięci, z jednego miejsca w drugie. Pierwszy parametr "przeznaczenie", to wskaźnik gdzie ma zostać przkopiowany tekst(lub inne dane). Drugi parametr "zrodlo" to także wskaźnik, ale na to co ma zostać skopiowane. Trzeci parametr to ilość kopiowanych danych w bajtach(komórkach pamięci). Spójrzmy na przykład w jaki sposób możemy skopiować tekst do tablicy.

#include <iostream>


int main(int argc,char* argv[])
{
  char napis[
256
];
//tablica do której skopiujemy tekst

  memcpy(napis,
"Skopiowany tekst"
,
17
);
  std::cout<<napis<<std::endl;
  memcpy(napis,
"Drugi tekst w tej samej tablicy."
,
33
);
  std::cout<<napis<<std::endl;
  
//a teraz podamy wskaźnik na tablicę jako drugi parametr

  char tablica[]=
"tekst w tablicy."
;
  memcpy(napis,tablica,
17
);
  std::cout<<napis<<std::endl;
  system(
"PAUSE"
);
  return
0
;
}


W funkcji mempcy jako pierwszy parametr podajemy, wskaźnik do pamięci, gdzie bedziemy kopiować dane, czyli wskaźnik na tablicę napis. Jak pamiętamy sama nazwa tablicy jest wskaźnikiem, więc ją piszemy. W drugim parametrze piszemy tekst jaki zostanie skopiowany. Możemy tu także podać wskaźnik do innej tablicy, która będzie zawierała tekst do skopiowania. Trzeci to długość tekstu jaki kopiujemy, należy także uwzględnik znak końca tablicy. W naszym przypadku 17.

Funkcja nie musi kopiować tylko tekstu. Jej przeznaczeniem jest po prostu kopiowanie fragmentu pamięci.

Wejść na stronę:     Ilość osób online:
Prawa autorskie © 2008 crayze. Wszelkie prawa zastrzeżone.
crayze7@gmail.com