Datový typ string

[Pozor: je potřeba umět ke zkoušce (i pro případnou opakovanou průběžnou písemku).]

Popis datového typu string je i na stránkách vyučujícího (pod jednotlivými přednáškami)

Neordinální datový typ string (klíčové slovo) slouží k uchovávání řetězců znaků a práci s nimi. Jde o jednoduchý datový typ, třebaže se z určitého pohledu chová podobně jako pole hodnot typu char.

Konstantou typu string je (i prázdná) posloupnost znaků ohraničená apostrofy. Má-li konstanta obsahovat apostrof, musí tento být zdvojen. Netisknutelné znaky mohou být zapisovány pomocí znaku # následovaného ASCII hodnotou znaku v desítkové soustavě. Tyto sekvence nemohou být uvnitř apostrofů (byly by interpretovány jako obyčejné znaky), nesmějí být ale od řetězce nijak odděleny. Konstantu typu string nelze zapsat na více řádků. Příklady konstant typu string (#13#10 je dvojznak pro konec řádku na operačních systémech vycházejících z DOSu):

'a',   #13,   'ahoj, ja jsem retezec',   #13#10,   'ahoj'#13#10,   'ahoj'#13#10'zdar',   'mriz: #',   'To''s zkanhal!'

Pojmenované konstanty, uživatelsky definované typy a proměnné datového typu string lze deklarovat různými způsoby:

type	retezec1 = string;
	retezec2 = string[20];
const	retez1 = 'ahoj';
	retez2 : string = 'zdar';
	retez3 : string[20] = 'no nazdar';
var	ret1 : string;
	ret2 : string[20];
	ret3 : retez;
Číslo v hranatých závorkách musí být z rozsahu 1 .. 255 a udává maximální délku řetězce. Není-li uvedeno, předpokládá se 255. Pokud bude hodnota přiřazovaná do proměnné delší než tato maximální délka, budou přebytečné znaky ignorovány. Kratší pochopitelně být může.

K proměnným a pojmenovaným konstantám datového typu string lze přistupovat i jako k polím znaků, kde povolené indexy jsou 0 až maximální délka daného řetězce. V nultém prvku pole je uložen znak, jehož ordinální hodnota udává skutečnou aktuální délku řetězce, v dalších prvcích pole jsou postupně uloženy znaky řetězce. Jednotlivé znaky lze z řetězce číst nebo je měnit stejně jako prvky pole (např. ret1[10] := ret2[11]). Je nutné si uvědomit, že změna hodnoty nultého prvku mění délku řetězce.

Nad datovým typem string lze použít relační operátory (tzv. lexikografické uspořádání, dle ASCII/ordinálních hodnot znaků, např. '-1' < '-11' či 'A' < 'a') a operátor zřetězení (konkatenace) + (např. '1' + '1' = '11'). Proměnným datového typu string lze přiřadit konstanty či proměnné datového typu char, naopak nikoli.

Proměnné datového typu string lze načítat a vypisovat pomocí standardních procedur Read/ReadLn a Write/WriteLn. Dva řetězce za sebou je nanejvýš vhodné načítat dvěma příkazy ReadLn, jiné varianty velmi pravděpodobně nepovedou k úspěchu, podrobněji viz zde.

S řetězci lze pracovat i pomocí následujících funkcí (podrobné popisy i s příklady jsou dostupné v nápovědě), všechny korektně zpracovávají nultý prvek řetězce:

Length(s: string): byte funkce vracející délku řetězce (tedy ekvivalentní ord(s[0])).

Concat(s1 [, s2, ...]: string): string funkce spojující jednotlivé argumenty v daném pořadí do jednoho řetězce. Pokud má výsledný řetězec více než 255 znaků, jsou znaky za 255 pozicí ignorované (tedy ekvivalentní s1 + s2 + ...).

Str(num: číselný typ; [width [, decimal]: integer;] var s: string) procedura konvertující číslo na řetězec, parametry width a decimal mají stejný význam jako modifikátory u procedury write[ln].

Val(s: string; var out: číselný typ; var err: integer) procedura konvertující řetězec s na číslo, které vloží do out. Pokud je řetězec chybný, je hodnota out je nedefinována a proměnná err udává pozici prvního chybného znaku (neodpovídajícího formátu čísla daného typu), jinak je err nastavena na nulu. Řetězec může obsahovat počáteční mezery či tabelátory (nikoli znaky konce řádku, jako je to při načítání číselných proměnných skrze Read[Ln]).

Pos(substr, s: string): byte funkce hledající podřetězec substr v řetězci s, pokud je podřetězec nalezen, je vrácena pozice, na které začíná jeho první výskyt, jinak je vrácena nula.

Pos('se', 'jak se mas') = 5

Copy(s: string; index, count: integer): string funkce vracející podřetězec řetězce s začínající na pozici index o délce count znaků. Pokud je index větší než délka řetězce s, je vrácen prázdný řetězec, pokud je count větší, než počet znaků od pozice index do konce řetězce, jsou vráceny pouze znaky od pozice index do konce řetězce.

Copy('jak se mas', 5, 3) = 'se '

Delete(var s: string; index, count: integer) procedura, která vymaže část řetězce s začínající na pozici index o délce count znaků. Pokud je index větší než délka řetězce s, nebude vymazáno nic, pokud je count větší, než počet znaků od pozice index do konce řetězce, jsou vymazány pouze znaky od pozice index do konce řetězce.

{ s = 'jak se mas' } Delete(s, 5, 3); { s = 'jak mas' }

Insert(source: string; var dest: string; index: integer) procedura vkládající (nedochází tedy k přepisu stávajících znaků v řetězci) řetězec source do řetězce dest od pozice index. Pokud výsledný řetězec přesáhne maximální délku řetězce, jsou přebytečné znaky zanedbané.

{ s = 'jak mas' } Insert('se ', s, 5); { s = 'jak se mas' }