LEKCJA18.TXT

(22 KB) Pobierz
LEKCJA 18 - O �A�CUCHACH TEKSTOWYCH  
________________________________________________________________ 
W trakcie tej lekcji dowiesz si�,  
* jak manipulowa� �a�cuchami tekstowymi i poznasz kilka  
specjalnych funkcji, kt�re s�u�� w C++ w�a�nie do takich cel�w;  
* jak wykonuj� si� operacje plikowo-dyskowe. 
________________________________________________________________ 
 
OPERACJE NA �A�CUCHACH TEKSTOWYCH.  
 
String, czyli �a�cuch - to gupa znak�w "pisarskich" (liter, cyfr 
 
i znak�w specjalnych typu ?, !, _ itp.). Poniewa� C++ nie ma  
odzielnego typu danych "string" - �a�cuchy znak�w to tablice  
z�o�one z pojedynczych znak�w (typowe elementy typu char).  
Technik� obiektow� mo�na utworzy� klas� - nowy typ danych  
"string". W bibliotekach Microsoft C++ istnieje predefiniowana  
klasa CString, ale zanim przejdziemy do programowania  
obiektowego i zdarzeniowego - rozwa�my manipulowanie tekstami w  
spos�b najprostszy.  
 
Maksymaln� mo�liw� d�ugo�� napisu nale�y poda� wtedy, gdy w  
programie deklaruje si� zmienn� tekstow�: 
  
  char tekst1[40]; 
 
Jest to poprawna deklaracja zmiennej tekstowej o nazwie  
(identyfikator) tekst1. Maksymalna d�ugo�� tekstu, kt�ry mo�na  
umie�ci� w tej zmiennej tekstowej to - 40 znak�w (liter, cyfr,  
itp.). A je�li chc� zastosowa� tylko pojedynczy znak zamiast  
ca�ego napisu? To proste: 
 
char napis[1];  
 
Skoro d�ugo�� �a�cucha wynosi 1, to przecie� nie jest �aden  
�a�cuch! Informacja o d�ugo�ci (size - wielko��) wpisywana w  
nawiasy jest zb�dna. Uproszczona wersja utworzenia zmiennej  
jednoznakowej i nadania zmiennej nazwy wygl�da w tak:  
 
char znak;  
 
Nie jest to ju� jednak deklaracja zmiennej �a�cuchowej - lecz  
deklaracja zmiennej znakowej. �a�cuch znak�w (string) to grupa  
znak�w (dok�. tablica znakowa) zako�czona zwykle przez tzw.  
"wartownika" - znak NULL (zero). A pojedynczy znak to tylko  
pojedynczy znak. Nie ma tu miejsca (i sensu) dodawanie po  
pojedynczym znaku "wartownika" ko�ca tekstu - zera.  
 
Gdy w deklaracjach zmiennych tekstowych rezerwujesz miejsce w  
pami�ci dla napis�w - zawsze mo�esz za��da� od kompilatora C++  
zarezerwowania wi�kszej ilo�ci miejsca - na zapas. Zawsze lepiej 
 
mie� zbyt du�o miejsca, ni� zbyt ma�o.  
 
[???] LEPIEJ MIE� NI� NIE MIE�. 
________________________________________________________________ 
 
Upewnij si�, czy kompilator zarezerwowa� (a Ty zadeklarowa�e�)  
wystarczaj�co du�o miejsca dla Twoich tekst�w. C++ niestety nie  
sprawdza tego w trakcie dzia�ania programu. Je�li b�dziesz  
pr�bowa� umie�ci� w pami�ci tekst o zbyt du�ej d�ugo�ci (d�u�szy 
 
ni� zadeklarowa�e� w programie), C++ pos�usznie zapisze go do  
pami�ci, ale mo�e to spowodowa� nieprawid�owe dzia�anie, b�d�  
nawet "zawieszenie" programu.  
________________________________________________________________ 
 
Inn� przydatn� w praktyce programowania cech� j�zyka C++ jest  
mo�liwo�� zadeklarowania zawarto�ci zmiennej tekstowej w  
momencie zadeklarowania samej zmiennej. Takie nadanie  
pocz�tkowej warto�ci nazywa si� zdefiniowaniem, b�d�  
zainicjowaniem zmiennej. W programie zapisuje si� to tak:  
 
  char napis[] = "To jest jakis napis";  
 
Powoduje to przypisanie zmiennej tekstowej "napis" konkretnego  
�a�cucha tekstowego "To jest jaki� napis". Zwr�� uwag�, �e w  
nawiasach nie podajemy ilo�ci znak�w, z kt�rych sk�ada si�  
tekst. Kompilator sam policzy sobie ilo�� znak�w (tu 19) i  
zarezerwuje miejsce w pami�ci dla napisu. Je�li wolisz sam  
zadecydowa�, mo�esz zapisa� deklaracj� tak:  
 
  char napis[35] = "To jest jakis napis";  
 
Je�li to zrobisz, kompilator C++ zarezerwuje w pami�ci miejsce  
dla 35 znak�w, a nie dla 19.  
 
W programach cz�sto inicjuje si� teksty pos�uguj�c si� nie  
tablic� znakow� - lesz wska�nikiem do tekstu. Deklaracja i  
zainicjowanie wska�nika (wska�nik wskazuje pierwszy element  
�a�cucha znakowego) wygl�da wtedy tak:  
 
char *p = "Jakis tam napis";  
 
Rzu�my okiem na kilka gotowych funkcji, kt�re do manipulowania  
tekstami oferuje C++.  
 
��CZENIE TEKST�W.  
  
[S] String Concatenation - ��czenie �a�cuch�w tekstowych. 
Zlepek/skr�t. S�owo strcat w j�zyku C++ znaczy sklej.  
 
W praktycznych programach zapewne cz�sto pojawi si� dwa lub  
wi�cej tekst�w, kt�re trzeba b�dzie po��czy� w jeden napis.  
Wyobra�my sobie, �e imi� i nazwisko u�ytkownika mamy zapisane  
jako dwa oddzielne �a�cuchy tekstowe. Aby po��czy� te dwa teksty 
 
w jeden trzeba przeprowadzi� tzw. sklejanie (ang. concatenation) 
 
tekst�w. W j�zyku C++ mamy w tym celu do dyspozycji specjaln�  
funkcj�:  
 
strcat() - STRing conCATenation - sklejanie �a�cuch�w.  
 
Aby po��czy� dwa �a�cuchy tekstowe napis1 i napis2 w jeden  
nale�y zastosowa� t� funkcj� w taki spos�b:  
 
  strcat(napis1, napis2);  
 
Funkcja strcat() zadzia�a w taki spos�b, �e �a�cuch znak�w  
napis2 zostanie do��czony do ko�ca �a�cucha napis1. Po  
zako�czeniu dzia�ania funkcji zmienna napis1 zawiera "sw�j  
w�asny" napis i do��czony na ko�cu napis zawarty uprzednio w  
zmiennej napis2.  
 
Program poni�ej przedstawia praktyczny przyk�ad zastosowania  
funkcji strcat().  
 
[P066.CPP] 
 
#include <conio.h>  
#include <iostream.h> 
#include <string.h>     //W tym pliku jest prototyp strcat() 
  
int main(void)  
{  
char imie[50], nazwisko[30];  
 
clrscr();  
   cout << "Podaj imie: ";  
   cin >> imie;  
  
   cout << "Podaj nazwisko: ";  
   cin >> nazwisko;  
  
   strcat(imie, " ");     
   strcat(imie, nazwisko);    
  
   cout << "\nNazywasz sie: " << imie << '\n';  
   cout << "Naci�nij dowolny klawisz";  
getch();  
return 0; 
}  
  
 
Program zapyta najpierw o imi� a nast�pnie o nazwisko. Po  
wpisaniu przez Ciebie odpowiedzi program doda do siebie oba  
teksty i wypisze na ekranie Twoje imi� i nazwisko w ca�o�ci.  
Interesuj�xe w programie jest po��czenie przy pomocy funkcji C++ 
 
strcat() dwu �a�cuch�w tekstowych w jeden �a�cuch z dodaniem  
spacji rozdzielaj�cej �a�cuchy znak�w. Najistotniejszy fragment  
programu wraz z komentarzem - poni�ej. 
 
   strcat(imie, " "); <-- dodaj do ko�ca tekstu spacj� 
   strcat(imie, nazwisko);    <-- po do��czonej spacji dodaj  
                               drugi tekst - nazwisko 
 
Poniewa� prototyp funkcji strcat() znajduje si� w pliku STRING.H 
 
- nale�y do��czy� ten plik nag��wkowy dyrektyw� #include.  
 
D�UGO�� �A�CUCHA TEKSTOWEGO.  
 
Ka�dy tekst ma swoj� d�ugo��: liczb� znak�w, z kt�rych si�  
sk�ada. Dla przyk�adu �a�cuch znak�w:  
 
"Przychodzi katecheta do lekarza i p�acze, a lekarz na to: B�g  
da� - B�g wzi��..."  
 
ma dla d�ugo�� 71, poniewa� sk�ada si� z 71 znak�w (odst�p -  
spacja to te� znak). �a�cuch znak�w  
 
"Ile diab��w mie�ci si� w �ebku od szpilki?"  
 
ma d�ugo�� 42. Teoretycznie d�ugo�� �a�cuch�w znakowych mo�e  
wynosi� od 0 do niesko�czono�ci, ale w Borland/Turbo C++  
wyst�puje ograniczenie: �a�cuch znak�w mo�e mie� d�ugo�� zawart� 
 
w przedziale od 0 do 65536 znak�w. Taki np. �a�cuch znak�w jest  
ca�kiem do przyj�cia: 
 
"Nie wa�ne, czy Polska b�dzie bogata, czy biedna - wa�ne, �eby  
by�a katolicka (czyli nasza), bo nasze b�d� wtedy pieni�dze,  
urz�dy i nasza w�adza. Lepiej by� p�-Bogiem w�r�d n�dzarzy  
(oczywi�cie za ich pieni�dze, z ich podatk�w), ni� zarabia� na  
chleb w�asn� prac�." 
 
[S] Null string - �a�cuch zerowy.  
________________________________________________________________ 
 
�a�cuch zerowy (dok�adniej: �a�cuch tekstowy o zerowej d�ugo�ci) 
 
to taki �a�cuch, kt�ry zawiera 0 (zero) znak�w. Jak to mo�liwe,  
by �a�cuch tekstowy zawiera� zero znak�w? W C++ �a�cuchy znak�w  
zawieraj� na ko�cu znak '\0' (zero) jako "wartownika" ko�ca  
tekstu. Je�li pierwszy element tablicy znakowej b�dzie zerem -  
powstanie w�a�nie �a�cuch znakowy o zerowej d�ugo�ci. Mo�na to  
zrobi� np. tak:    
 
char napis[0] = 0;  
char *p = "";  
char napis[50] = ""; 
________________________________________________________________ 
 
 
Kiedy C++ wyznacza d�ugo�� �a�cucha znak�w - zlicza kolejne  
znaki, a� dojdzie do zera. W przyk�adzie ju� pierwszy znak jest  
zerem, wi�c C++ uzna, �e d�ugo�� takiego �a�cucha wynosi zero.  
Czasem w praktyce programowania zainicjowanie takiego pustego  
�a�cucha pozwala mie� pewno��, �e tablica nie zawiera jakich�  
starych, zb�dnych danych.  
 
Mo�liwo�� sprawdzenia, jak� d�ugo�� ma �a�cuch tekstowy mo�e si� 
 
to przyda� np. do rozmieszczenia napis�w na ekranie. Dla  
przyk�adu, pozycja na ekranie, od kt�rej rozpocznie si�  
wy�wietlanie napisu zale�y od d�ugo�ci tekstu, kt�ry zosta�  
wy�wietlony wcze�niej. Do okre�lania d�ugo�ci tekstu masz w C++  
do dyspozycji gotow� funkcj�:  
 
strlen() - STRing LENgth - d�ugo�� �a�cucha znakowego.  
 
Funkcj� strlen() stosuje si� w nast�puj�cy spos�b:  
 
unsigned int dlugosc;  
char tekst[...]; 
 ...  
   dlugosc = strlen(tekst);  
 
Funkcja ma jeden argument - napis, kt�rego d�ugo�� nale�y  
okre�li� (tu: zmienna nazywa si� tekst). Funkcja strlen() w  
wyniku swojego dzia�ania ZWRACA d�ugo�� �a�cucha tekstowego jako 
 
liczb� ca�kowit� bez znaku (nieujemn�). Liczba zwr�cona jako  
wynik przez funkcj� strlen() mo�e zosta� u�yta w dowolny spos�b  
- jak ka�da inna warto�� numeryczna.  
 
Funkcja strlen() nie podaje w odpowiedzi na wywo�anie (m�drze  
nazywa si� to "zwraca do programu warto��") d�ugo�ci �a�cucha  
tekstowego, kt�ra zosta�a zadeklarowana (maksymalnej  
teoretycznej), lecz FAKTYCZN� D�UGO�� tekstu. Je�li, dla  
przyk�adu, zadeklarujemy zmienn� tekstow� tak:  
 
  char string1[30] = "Lubie C++ ";  
 
zadeklarowana maksymalna d�ugo�� �a�cucha znakowego wynosi 30,  
natomiast faktyczna d�ugo�� �a�cucha znakowego wynosi 10 znak�w. 
 
Je�li wywo�amy strlen() i ka�emy ...
Zgłoś jeśli naruszono regulamin