Pascal pro začátečníky 13 - Práce s textovými řetězci

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: Kub@z
Datum: 27.7.2004
Hodnocení/Hlasovalo: 1.74/53

Dnes si povíme něco o tom, jak v pascalu pracovat s textovými řetězci trochu lépe, než jen stylem "text := '';" :)...

Tato kapitola bude o tom, jak se pracuje s textovými řetězci (nečekaně :). Základní způsob práce s řetězci spočívá v tom, že je možné s ním pracovat jako s polem znaků. Tzn. že zápis „var text: string[50];“ je v principu stejný jako „var text: array[1..50] of char;“, a tak s ním také můžeme pracovat. K další práci s textem slouží v Pascalu tyto funkce:

function Copy(S: String; Index: Integer; Count: Integer): String;
procedure Delete(var S: String; Index: Integer; Count:Integer);
procedure Insert(Source: String; var S: String; Index: Integer);

function Pos(Substr: String; S: String): Byte;
function Length(S: String): Integer;

Názvy funkcí už vypovídají o tom, co ta funkce asi bude dělat. Takže si to rozebereme od začátku. Funkce „copy“ dostane jako parametr řetězec, pozici a počet a vrátí řetězec zkopírovaný z dané pozice do dané pozice + počet:

begin
writeln(copy(‘Ahoj lidi’,3,5)); (* vypíše „oj li” *)
end.

Doufám, že je to jasné. Funkce „delete“ smaže zadanou část textového řetězce:

var txt: string;
begin
txt := ‘Ahoj lidi’;
delete(txt,3,5);
writeln(txt); (* vypíše „Ahdi“ *)
end.

A konečně funkce „insert“ vloží řetězec na zadanou pozici:

var txt: string;
begin
txt := ‘Ahoj lidi’;
insert(‘vsichni ’,txt,6);
writeln(txt); (* vypíše „Ahoj vsichni lidi“ *)
end.

Pak zde máme funkci „length“, která nám vrátí délku řetězce a funkci „Pos“, která nám vrátí pozici podřetězce v řetězci. Příklad:

begin
writeln(pos(‘Petr’,‘On se jmenuje Petr Novak’));

(* „Petr“ začíná na 15 znaku *)
end.

Pokud se zadaný podřetězec v řetězci nenachází, funkce vrátí hodnotu 0. Proto se dá dobře využít k zjištění, jestli se v řetězci nachází jiný řetězec. S těmito znalostmi už můžete vymyslet program, který by např. dokázal odizolovat z textového řetězce jednotlivé položky oddělené dvojtečkou - program by třeba dostal ke zpracování text „ahoj lidi:petr:dalsi text:a jeste jeden“ a z něj by vypsal:

ahoj lidi
petr
dalsi text
a ještě jeden

Zkuste to vymyslet a porovnejte svůj program se vzorovým řešením, které zde uvedu. U tohoto zadání jsou prakticky možnosti dvě - pomocí „pos“:

var txt: string;
begin
txt := 'ahoj lidi:petr:dalsi text:a jeste jeden';
while true do begin (* cyklus se pořád opakuje *)
if pos(':',txt) > 0 then begin (* když nejsme u poslední položky *)
writeln(copy(txt,1,pos(':',txt)-1));
(* vypíšeme text od pozice 1 do dvojtečky *)
delete(txt,1, pos(':',txt)); (* položku textu smažeme *)
end
else begin (* za poslední položkou už není dvojtečka *)
writeln(txt); (* v „txt“ už zbyl pouze poslední text *)
break; (* cyklus se přeruší *)
end;
end;
end.

Nebo pomocí práce se stringem jako s polem znaků:

var txt: string;
    i,z: integer;
begin
txt := 'ahoj lidi:petr:dalsi text:a jeste jeden';
z := 1;
for i := 1 to length(txt) do begin (* projdeme text až do konce *)
if txt[i] = ‘:’ then begin (* když narazíme na dvojtečku *)
writeln(copy(txt,z,i-z)); (* vypíšeme text *)
z := i + 1;
end;
if i = length(txt) then writeln(copy(txt,z,i-z+1));
(* když jsme na konci textu *)
end;
end.

Jestli to nechápete, tak si projděte příklad řádek po řádku a říkejte si, co ten příkaz dělá a určitě to pochopíte.