Ř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Í: Pro načítaní textů z klávesnice je nejvhodnější funkce gets() - načte řádek i s mezerami. Pro výpis řetězců je vhodné použít printf() - můžeme lépe formátovat výstup než u funkce puts().
Příklad: Program načte text, vypíše jeho délku a porovná ho s dalším textem.
#include <stdio.h> #include <string.h> //pro pouziti standardnich funkci pro retezce #include <stdlib.h> int main() { char ret1[50], ret2[50]; int delka; printf("Zadejte text: "); gets(ret1); delka = strlen(ret1); //urci delku retezce tj pocet znaku v retezci printf("Pocet znaku v retezci \"%s\" je %d \n\n", ret1, delka); printf("Zadejte dalsi text: "); gets(ret2); // porovnani retezcu if(strcmp(ret1, ret2) == 0) { printf("\nZadane texty jsou stejne\n\n"); } else { printf("\nZadane texty nejsou stejne\n\n"); } system("pause"); return 0; }