Řetězec
Při programování potřebujeme často pracovat nejen s čísly, ale i s textem. Ukládáme názvy, hesla, řadíme jména, ... K tomu používáme tzv. řetězec. Řetězcem rozumíme posloupnost znaků, představuje libovolný text.
Řetězec je v jazyce C speciální typ jednorozměrného pole. Všechny prvky jsou typu char, jsou v něm tedy jenom znaky. S řetězcem lze pracovat jako s běžným polem, ale má navíc některé zvláštnosti. Posledním znakem v každém řetězci je tzv. nulový znak ('\0'). Proto je vhodné při deklaraci řetězce zvýšit maximální velikost o 1, musíme s ním počítat hlavně u kratších řetězců. Pokud při manipulaci s řetězcem dojde k vymazání koncového znaku, nevíme potom, kde text končí. S nulovým znakem pracují taky všechny funkce ze string.h. Při použití standardních funkcí se do řetězce vkládá automaticky, programátor se ním nemusí tedy zvlášť zaobírat.
Deklarace řetězce - příklady:
//deklarace retezcu veta a jmeno, maximalni pocet znaku uveden v hranate zavorce:
char veta[100], jmeno[20];
//deklarace s inicializací - hned nastavime obsah promenne, vlozime do ni text:
char mesto[10] = "HAVIROV";
//deklarace s inicializací
//velikost se nastaví automaticky na 5 (4 znaky textu + koncový znak):
char pozdrav[] = "Ahoj";
V případě deklarace proměnné mesto jsme hned v deklaraci vložili do proměnné uvedený text. Do paměti se uloží následovně:
V jednotlivých políčkách jsou znaky, jejich pořadí je určeno indexem stejně jako v poli. Pro názornost je index uveden pod textem. Vidíme, že na pozici mesto[7] byl automaticky vložen nulový znak. Poslední 2 políčka jsou prázdná, ale jsou nám k dispozici např. pro vložení delšího textu. Maximální počet znaků pro uložení do proměnné mesto je 10, včetně koncového znaku.
Řetězce, stejně jako běžné pole, můžeme zpracovat po prvcích. Můžeme tedy např. změnit nějaké písmeno v textu:
//zmena 3. znaku - s indexem 2 (index vzdy zacina od 0) :
mesto[2] = 'M';
//muzeme dokonce zkratit retezec:
mesto[4] = '\0';
//vysledkem bude retezec HAMI
Při zápisů textů v programu si dáváme pozor na odlišení řetězce (textu) a jednotlivých znaků. Konkrétní text píšeme vždy v uvozovkách a znak v jednoduchých apostrofech.
V programování se řetězce vyskytují často, proto byly vytvořeny standardní nástroje, které nám práci s nimi ulehčují. Jedná se o speciální funkce pro vstup/výstup řetězců nebo o knihovnu string.h.
Vstup a výstup řetězců
Pro načtení nebo výpis řetězců můžeme použít už známé funkce scanf() a printf(). Použijeme formátovací řetězec %s. Dokážeme tak načíst nebo vypsat celý řetězec najednou. Navíc u funkce scanf() nepoužíváme znak &, protože název pole je zároveň jeho adresou. Funkce scanf() přečte ze standardního vstupu řetězec, ale jen po nejbližší bílý znak. Neumí najednou načíst více slov oddělených mezerou, není proto obecně vhodná pro načítání řetězců. Funkce printf() nemá žádné omezení.
char jmeno[20];
scanf("%s", jmeno);
printf("Bylo nacteno jmeno: %s\n", jmeno);
Další funkce, speciálně určené jen pro vstup a výstup řetězců, jsou gets() a puts(). Obě jsou rádkově orientované. Funkce gets() čte ze standardního vstupu celý řádek (ukončen klávesou Enter) a uloží ho do určené proměnné. Znak '\n' (ukončení řádku) se do řetězce neukládá, řetězec je automaticky ukončen znakem '\0'.
Funkce puts() vypíše řetězec na obrazovku a navíc hned odřádkuje.
char veta[100];
gets(veta); //
načte zadané znaky z klávesnice a uloží je do proměnné veta
puts(veta); //
vypíše obsah řetězce veta na obrazovku a odřádkuje
DOPORUČENÍ: Funkci gets() považují některé překladače za nebezpečnou funkci, protože nemá omezení na délku načítaného řetězce. Vhodnější je potom funkce fgets(), kterou můžeme použít pro čtení textů ze souboru, ale taky pro čtení řádků textu ze standardního vstupu (klávesnice). Funkce fgets() čte řádek včetně jeho ukončení ('\n'). Tento znak z řetězce odstraníme posunutím konce řetězce o 1 pozici vpřed. Použití je potom podle následujícího příkladu.
char veta[100];
int delka;
fgets(stdin, 100, veta); //načte řetězec z klávesnice
delka = strlen(veta);
veta[delka - 1] = '\0';
printf("Nacteny text: %s", veta); //
vypíše obsah řetězce veta na obrazovku