Stringovi

 

Stringovi se veoma često koriste u programiranju. Object Pascal definiše tri različita tipa: dugi string (long string), kratki string (short string) i široki string (wide string).

Dodatno, Pascal koristi null string. Opisaću kratko svaki od ovih tipova, a zatim ću objasniti neke funkcije za manipulaciju stringovima.

 

Kratki string (short string)

Tip kratkog stringa (short string) ima fiksnu dužinu koja maksimalno iznosi 255 karaktera. Deklarisanje katkih stringova se može uraditi na dva načina. Jedan od načina je korišćenje prethodno definisanje tipa promenljive kao ShortString da bi deklarisali kratki string dužine 255 bajtova. Takođe možete koristiti ključnu reč string uz dodatak operatora indeksa koji određuje dužinu stringa:

 

var

S1 : ShortString; { najvise 255 simbola}

S2 : string[20]; { najvise 20 simbola}

 

Manipulacija stringovima korišćenjem kratkih stringova je brža pošto se količina memorije rezervisane za stringove ne menja. Ipak smatra se da je kratki string zastareo i preporučuje se korišćenje dugih stringova. Kratki stringovi se još mogu nazvati bajt stringovima, pošto prvi element stringa sadrži dužinu stringa ( broj karaktera u okviru stringa). Na primer, da biste odredili dužinu stringa možete pročitati vrednost prvog elementa kratkog stringa.

var

S : ShortString; { najvise 255 simbola}

n : Integer;

begin

S := ’Zdravo’;

n := Ord(S[0]); { duzina stringa je 6}

end;

 

Ovaj primer čita vrednosti stringa S[0] da bi odredio dužinu stringa. Da bi odredili dužinu kratkog stringa možete takođe koristiti funkciju Length. Funkcija

Da biste konvertovali vrednost tipa Char u celobrojnu vrednost (ordinalnu vrednost) treba da koristite funkciju Ord. Funkcija Ord se koristi i kod numerisanja.

Da biste tačno definisali dužinu stringa ukoliko je to potrebno, možete u string upisati prvi element. Određene situacije zahtevaju ovakav pristup. Dodao bih samo da u principu, korišćenje kratkog stringa dužine 0 bajta spada u napredne tehnike programiranja i ne preporučuje se programerima početnicima.

 

Dugi string (long string)

Tip podataka deklarisan kao dugi string (long string) dinamički rezerviše memoriju za dati objekat. Dužina dugog stringa je ograničena samo veličinom slobodne memorije. Object Pascal rezerviše, odnosno oslobađa memoriju u zavisnosti od potreba stringa. Dugi stringovi su veoma fleksibilni ali ponekad i sporiji u odnosu na kratke stringove, naročito kada se sa njima intenzivno manipuliše. Razlog leži u dinamičkom rezervisanju mesta u memoriji za duge stringove i njihovoj izmeni sadržaja. Sve dok brzina izvršavanja operacija nije bitna, trebalo bi da se držite korišćenja dugih stringova u aplikacijama. Da biste deklarisali dugi string koristite ključnu reč string bez navođenja parametara dužine:

var

S : string; {Dugi niz dinamicki dodeljen}

 

Pošto su stringovi dinamički raspoređeni, možete ih menjati po želji, a da istovremeno ne brinete šta se u pozadini događa. Korišćenje dugih stringova je veoma jednostavno pošto ne morate da brinete o rezervisanju prostora za string, odnosno da li ćete prekoračiti dozvoljenu dužinu. Sve je manje više automatizovano.

Dugi stringovi za razliku od kratkih stringova nemaju element 0. Pokušaji pristupa nultom elementu kod dugih stringova kao rezultat daje grešku prevodioca. Umesto toga dužinu dugog stringa možete dobiti korišćenjem funkcije Length, odnosno dužinu možete dodeliti procedurom SetLength.

 

Široki stringovi (wide string)

 

Tip podataka široki string (wide string) se koristi u sprezi sa Windows API funkcijama koje zahtevaju dvobajanje karakter stringove (Unicode karakter stringove).

Široki string ima sličnosti sa dugim stringom pošto je njegova dužina ograničena raspoloživom memorijom, odnosno memorijom koju je string dinamički rezervisao.

Široke stringove neću detaljnije opisivati.

 

Null stringovi: PChar i niz karaktera (Array of Char)

 

Za razliku od jezika Object Pascal, jezici C i C++ nemaju prave string tipove podataka.

U jezicima C i C++ stringovi su inplementirani kao nizovi karaktera koji se završavaju terminirajućom nulom (0 na kraju stringa). Karakter nizovi nemaju bajt dužine, pa se terminirajuća nula koristi da označi kraj stringa karaktera. Pošto je operativni sistem Windows pisan na jeziku C, većina Windows funkcija zahteva karakter niz kao parametar. Pascal stringovi nisu karakter nizovi, pa je potrebno definisati karakter niz ukoliko se želi postići da Pascal stringovi rade sa Windows funkcijama. Tip PChar eliminiše ovaj nedostatak. PChar se može koristiti tamo gde su potrebni karakter nizovi. Primer je Windows funkcija MessageBox. Ova funkcija koja prikazuje standardni Windows dijalog za poruke, ima sledeću deklaraciju:

 

function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType:UINT): Integer;

 

Drugi i treći parametar zahteva korišćenje pointera (ukazivača) na karakter niz (drugi za tekst okvira za poruke, a treći za naslov okvira za poruke). Da bi pozvali ovu funkciju iz Delphi programa, morate koristiti tip PChar na sledeći način:

var

Text : string;

Caption : string;

begin

Text := 'This is a test.';

Caption := 'Test Message';

MessageBox(0, PChar(Text), PChar(Caption), 0);

end;

U ovom slučaju tip PChar je korišćen za dodeljivanje Pascalovog dugog stringa nultom terminirajućem stringu. Tip PChar takođe možete samostalno koristiti. Ovo je ilustrovano sledećim primerom.

var

Text : PChar;

begin

Text := 'This is a test.';

MessageBox(0, Text, 'Message', 0);

end;

 

Pošto Pascal stringovi imaju snažnu podršku za manipulaciju stringovima, verovatno nećete često koristiti tip PChar. Obično ćete PChar koristiti za konverziju dugih stringova u stringove terminisane nulom, kao što je navedeno u prethodnom primeru. Uočite da Windows API funkciji možete proslediti string literal (string karaktera unutar jednostrukog znaka navoda), u očekivanju tipa PChar.

Na kraju, umesto tipa PChar možete koristiti niz karaktera. Da bi ovo ilustrovali prethodni isečak koda je ponovo izmenjen:

var

Text : array [0..20] of Char;

begin

Text := 'This is a test';

MessageBox(0, Text, 'Message', 0);

end;

Nije važno koji od ovih metoda koristite. Samo zapamtite da za pozive Windows API funkcija ne možete koristiti Pascalov tip podataka string pošto Windows API funkcije

zahtevaju kao parametar stringove terminisane nulom. U ovakvim slučajevima treba da koristite tip PChar, odnosno niz karaktera.

 

Tipovi Pascalovih stringova imaju nekoliko zajedničkih elemenata. U ovom poglavlju će biti opisane osnovne operacije koje se odnose na sve tipove stringova.

Povezivanje stringova korišćenjem operatora + Uobičajen zadatak prilikom programiranja je povezivanje stringova (dodavanje stringova). Stringovi mogu biti povezani korišćenjem operatora +; na primer:

var

S1 : string;

S2 : string;

begin

S1 := 'Mallory Kim';

S2 := 'Reisdorph';

Label1.Caption := S1 + ' '+ S2;

end;

Ovaj kod povezuje tri stringa (promenljivu S1, string koji sadrži prazno mesto i promenljivu S2), a zatim dodeljuje rezultat karakteristici Caption natpisa Label1.

Bilo koji izraz odnosno funkcija koja kao rezutat daje string može se koristiti za povezivanje stringova. Evo još jednog primera:

var

X : Integer;

begin

X := 199;

Label1.Caption := 'The result is: '+ IntToStr(X);

end;

U ovom slučaju funkcija IntToStr vraća tip string koji možete da koristite kao rezultat funkcije bilo gde, gde se traži string.

 

Operator indeksa

Još jedan uobičajen slučaj Pascalovih stringova je operator indeksa ([ ]).

Korišćenjem operatora indeksa možete izdvojiti pojedinačni karakter iz stringa, kao u primeru:

var

S1 : string;

S2 : Char;

begin

S1 := 'Hello World!';

S2 := S1[1];

Label1.Caption := S2;

end;

Promenljiva S2 u ovom primeru je tipa Char, ali bi mogla da bude i dugi string, kratki string, odnosno široki string. Object Pascal konvertuje u odgovarajući format u pozadini, pa na nivou aplikacije nema potrebe da radite sa različitim tipovima stringova. Operator indeksa je od koristi kada Vam se ukaže potreba da pretražujete string karakter po karakter. Stringovi počinju brojem 1: prvi karakter stringa je

SŠ1Ć. Zapamtite da nulti element kratkog stringa (SŠ0Ć) sadrži dužinu stringa, a ne prvi karakter stringa. U slučaju dugih stringova, odnosno širokih stringova nije moguće pristupiti elementu S[0].

Kontrolni karakteri u stringu  Object Pascal omogućava ubacivanje kontrolnih karaktera u stringove. Ovo je korisno ukoliko imate potrebu za dodavanjem karaktera koji neće biti štampani. Ovi

karakteri mogu biti jednostavni, poput karaktera za novu liniju u okviru stringa, odnosno složeni, kao što je ubacivanje kontrolnih karaktera u string koji se šalje serijskom uređaju.

Dodavanje kontrolnih karaktera stringu se vrši korišćenjem karaktera #. Ukoliko bi, na primer, želeli da dodate karakter escape (ASCII 27) u Vaš string, ovo možete učiniti na sledeći način:

S := 'This is a test. Escape follows'+ #27 +'Finished';

Uočite da je dodati karakter #27 smešten van znakova navoda, i da između umetnutog karaktera i stringova ne postoji prazno mesto. Da biste koristili umetnute karaktere

morate pratiti ovu strukturu. Umesto literala možete koristiti takođe i string promenljive:

S1 := 'This is a test. Escape follows.';

S2 := 'Finished.';

S3 := S1 + #27 + S2;

Ovu teoriju možete jednostavno testirati. Ubacite dugme i natipis u formu. Kliknite dva puta na dugme i dodajte sledeću liniju u okviru opcije OnClick upravljača događajima:

Label1.Caption := 'Line 1' + #10 + 'Line 2'.;

Sada pokrenite program i kliknite na dugme. Natpis će sadržati dve linije teksta. Ovaj kod jednostavno ubacuje karakter za prelaz u sledeći red (ASCII 1O) u string deleći na taj način natips na dve linije.

Proširivanje stringa na više programskih linija Često je potrebno ispisati string u okviru dve , odnosno više programskih linija da bi se poboljšala čitljivost i upravljivost koda. Dugi tekstovi poruka na primer, mogu sadržati i preko 200 karaktera. Sve ove karaktere možete staviti u jednu liniju koda (maksimalna dužina linije Delphi editora koda je 1024 karaktera), ali bi ovo učinilo

kod skoro nečitljivim. Umesto da delite string na više linija, potrebno je da koristite operator +, kao u primeru:

MessageBox(0, 'This is a very, very long message'+

'that seems to go on and on forever. In order '+

'to make the code more readable the message has' +

'been split across several lines of code', 'Message', 0);

Da li se sećate dela kada smo obrađivali znak tačka-zarez i završetke segmenta koda? Ovo je primer kada se iskaz prostire na više programskih linija. Ovo je još uvek jedan iskaz po pitanju prevodioca, pa znak tačka-zarez treba da stoji na kraju iskaza a ne na kraju svake linije.

 

Poređenje stringova

Poređenje stringova se vrši korišćenjem operatora za poređenje.  Operatori za poređenje stringova

 

= jednako

<> nije jednako

< manje je od

> veće je od

<= manje ili jednako

>= veće ili jednako

Zapamtite da ovi operatori porede stringove na bazi njihovih ASCII vrednosti.U većini slučajeva ćete koristiti opeatore jednakosti da biste proverili da li je string jednak odnosno da li se razlikuje od navedene vrednosti. Ukoliko sortirate stringove, verovatno ćete koristiti i druge operatore za poređenje stringova. Sledeći primer proverava da li string sadrži određenu vrednost:

if FileName = 'TEST.TXT'  then

                                            OpenFile(FileName)

                                          else

                                            ReportError;

 

Funkcije za manipulaciju stringovima

 

Object Pascal sadrži veliki broj funkcija i procedura za manipulaciju stringovima.

Copy Vraća deo stringa.

Delete Briše deo stringa.

Format Formatira i vraća string na osnovu formata stringa i prosleđenih argumenata.

Insert Ubacuje tekst u string.

IntToStr Konvertuje celobrojnu vrednost u string.

Length Vraća dužinu stringa.

LowerCase Konvertuje sva slova stringa u mala slova.

Pos Vraća poziciju traženog stringa koji je sadržan u navedenom stringu.

StringOfC har Vraća string popunjen navedenim brojem definisanih karaktera.

StrPas Konvertuje string terminiran nulom (PChar, odnosno karakter niz) u Pascalov string.

StrPCopy Konvertuje Pascalov string u string terminiran nulom.

StrToInt Konvertuje string u ceo broj. Ukoliko string ne može biti konvertovan,izbacuje izuzetak.

StrToIntDef Konvertuje string u ceo broj i daje generičku vrednost u slučaju da string ne može biti konvertovan. Ukoliko string ne može biti konvertovan, ne izbacuje izuzetak.

StrToXXX Dodatna funkcija za konverziju koja konvertuje string u broj sa pokret nim zarezom, odnosno u vrednosti Currency, Date, Time.

Trim Odseca prazna mesta na početku i na kraju stringa.

UpperCase Konvertuje sva slova stringa u velika slova.

XXXToStr Dodatna funkcija za konverziju koja konvertuje broj u pokretnom zarezu, odnosno vrednosti Currency, Data, Time u string.

 

Object Pascal sadrži dodatni set funkcija koje rade sa stringovima koji su terminisani nulom.Ovde ih nećemo obraditi pošto ćete uglavnom koristiti Pascalove stringove, a ne stringove

terminisane nulom. Proverite Delphi help ukoliko tražite dodatne informacije o ovim funkcijama.Većina funkcija koje operišu sa stringovima terminisanim nulom počinju sa Str.

Nekoliko funkcija i procedura  zahtevaju poseban ostvrt.

Funkcija StrToInt konvertuje string u celobrojnu vrednost. Recimo da imate komponentu za editovanje koja se koristi da prihvati celobrojnu vrednost od korisnika.

Pošto komponenta za editovanje može prihvatiti samo tekst, morate tekst konvertovati u ceo broj. Ovo možete učiniti na sledeći način:

Value := StrToInt(Edit1.Text);

I druge StrToXXX funckije (StrToFloat, StrToDate itd.) rade na potpuno isti način. Zapazite da ove funkcije izbaciju izuzetak ako konverzija nije uspela. Ukoliko

na primer, korisnik unese S123, biće izbačen izuzetak pošto se slovo S ne može konvertovati u ceo broj. O izuzecima još nisam pisao, pa ih u ovom trenutku neću detaljnije objašnajvati.

Funkcija Format omogućava kreiranje stringa prosleđivanjem željenog stringa i dodatnih argumenata. Sledeći primer koji dodaje dva broja koristi funkciju Format da bi kreirao string koji prikazuje rezultat:

var

S : string;

X : Integer;

begin

X := 10 * 20;

S := Format('The result is:' %d., [X]);

Label1.Caption := S;

end;

Kada se izvrši ovaj deo koda, natpis sadrži sledeći tekst:

The result is: 200

U ovom primeru znak %d predstavlja funkciju za formatiranje: .Celobrojna vrednost se nalazi ovde.. Na kraju formatiranog stringa dodata je promenljiva X koja ukazuje funkciji Format koju vrednost da stavi na poziciju stringa (sadržaj promenljive X).

Funkcija Format je jedinstvena po tome što može da primi različit broj argumenata. (Iz tog razloga se promenljiva X nalazi u uglastoj zagradi; argument se prosleđuje u formi niza konstanti.) String za formatiranje mora biti obezbeđen, a broj argumenata koji se nalaze iza stringa za formatiranje je promenljiv.