Textový řetězec
Textový řetězec (anglicky string) je v informatice konečná posloupnost grafických symbolů (grafémů, znaků), která reprezentuje určitý text. Symboly se v řetězci mohou opakovat a na jejich pořadí a opakování záleží – 000
je jiný řetězec než 0
.
V programování je řetězec datový typ sloužící k uložení konečné posloupnosti znaků. Konkrétní řetězce (řetězcové literály) se pro odlišení od ostatních prvků programovacího jazyka obvykle píší do uvozovek ("abc"
) nebo apostrofů ('příklad'
).
V teorii formálních jazyků používané v matematické informatice, matematické logice a matematické lingvistice je řetězec konečná posloupnost symbolů patřících do určité konečné množiny nazývané abeceda.
Implementace textových řetězců v programovacích jazycích
Implementace proměnných, které obsahují znakové řetězce, není kvůli proměnné délce řetězců jednoduchá. Mnoho verzí jazyka Fortran umožňovalo pouze velmi omezené používání textových řetězců pro výpis informací, mnoho jazyků implementovalo textové řetězce jako pole znaků, často pevné délky (ALGOL 60, standardní Pascal); jazyk C má řetězce proměnné délky, ale programátor musí dávat pozor, aby nedošlo k překročení délky (přetečení bufferu).
Při reprezentaci řetězců proměnné délky se používají dva základní přístupy:
- délka řetězce je uložena v pomocné struktuře definující řetězec – deskriptoru řetězce (např. typ String v Turbo Pascalu)
- řetězec je ukončen zarážkou (znak s kódem 0 na konci řetězce v jazyku C)
Pro ukládání textových řetězců používají překladače různé strategie:
- konstantní – neměnný obsah (generovaný při překladu programu)
- staticky alokovaný paměťový prostor pro řetězec – řetězec má omezenou maximální délku
- dynamicky alokovaný paměťový prostor pro řetězec – řetězec má maximální délku omezenou jen velikostí volné paměti
Definice řetězce v programu
V nízkoúrovňových jazycích typu C se musí každý řetězec definovat jako datový typ pole znaků (char[]). Každý takový řetězec musí být ukončen znakem '\0', který se nepočítá do délky řetězce. Příklad definice prázdného řetězce o délce 100 znaků:
char retezec[100]; // Pozor - implicitně vynulováno jen u globální proměnné, jinak přidejte = "";
Dále je možné do řetězce rovnou fyzicky dosadit jednotlivé znaky (inicializovat pole znaků); to se dělá pomocí uvozovek:
char retezec[100] = "nejaky, max 99 osmibitovych znaku dlouhy retezec, bla, bla, bla, ...";
Také je možné používat řetězcové literály (konstanty, které nelze přepisovat):
char *ukazatel_na_retezec = "nejaky, libovolne dlouhy retezec, bla, bla, bla, ...";
Jazyk C neumí žádné další operace s řetězci – musí se volat funkce, které jsou součástí standardních knihoven.
V některých ostatních jazycích není nutné uvádět, že se jedná o řetězec a jak je dlouhý. Stačí jednoduše definovat proměnnou.
Příklad z jazyka PHP:
<?php
$retezec = "Já jsem nějaký řetězec a můžu obsahovat všemožné znaky z ASCII tabulky jako %, =, ' a jiné, ale třeba i z tabulky UNICODE (např. ▒, ☼, ♪). Můžu mít libovolnou velikost a jsem reprezentován dynamicky, podle velikosti paměti.";
Vnitřní implementace řetězce v PHP (a i v mnoha dalších dynamicky typovaných jazycích) funguje tak, že se nejprve vytvoří pole znaků základní délky podle obsahu řetězce, které se případně dynamicky rozšíří podle potřeby.[1] Takto lze libovolně do řetězce přidávat další obsah. Velikost vyhrazené paměti pro řetězec bude vždy mocnina dvojky.
Tisk řetězce
V nízkoúrovňových jazycích se řetězec tiskne voláním funkce (puts, printf, fprintf), v aplikovaných jazycích (např. PHP) lze volat jen jako dynamická proměnná.
Tento zápis v jazyce C vypíše obsah řetězce na standardní výstup:
puts(retezec); // vypise retezec
Tento zápis v jazyce C++ vypíše nultý znak (jazyky C i C++ indexují pole od nuly):
cout << retezec[0]; // vypis prvního znaku (jen pro neprazdny retezec)
Celý řetězec lze vypsat v aplikovaných jazycích, např. v PHP:
<?php
echo $retezec; // vypise retezec
Operace s textovým řetězcem
- získání znaku z i-té pozice textového řetězce: s[i]
- délka textového řetězce |s|
- spojení textových řetězců (zřetězení, concatenation) s1 + s2
- konverze velkých abecedních písmen na malá písmena
- konverze malých abecedních písmen na velká písmena
Rozšířené operace
- porovnání obsahu textových řetězců (ordinální nebo lexikální viz znaková sada)
- vyhledání pozice znaku v textovém řetězci
- vyhledání pozice podřetězce v textovém řetězci
- rozdělování řetězce na více řetězců (rozdělení na podřetězce)
Reference
- ↑ Zabraná paměť. PHP triky [online]. [cit. 2019-07-02]. Dostupné online.
Související články
Externí odkazy
- Obrázky, zvuky či videa k tématu textový řetězec na Wikimedia Commons
- Textový řetězec v České terminologické databázi knihovnictví a informační vědy (TDKIV)
- API třídy String v Javě Archivováno 19. 10. 2008 na Wayback Machine.