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 ...
lazarusp22