datový typ reprezentující konečnou posloupnost znaků From Wikipedia, the free encyclopedia
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 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:
Pro ukládání textových řetězců používají překladače různé strategie:
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.
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