Učíme se C (9.díl) - Řetězce - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



C/C++

Učíme se C (9.díl) - Řetězce

6. listopadu 2000, 00.00 | Dnes se dozvíte jak je to v jazyce C s datovým typem
řetězec a podíváme se i na některé funkce pracující s řetězci.

Minule jsme se věnovali polím, a přestože dnes bude řeč o řetězcích, od polí se daleko nevzdálíme. Je to proto, že jazyk C nemá implementovaný speciální datový typ pro řetězce. Ty jsou proto v C reprezentovány jako pole prvků typu char, kde je v každém prvku uložena ascii hodnota příslušného znaku řetězce. Jako poslední musí být vždy uveden znak EOS (end of string), což je znak s ascii hodnotou 0. Ten označuje konec řetězce. Z toho, jak jsou řetězce ukládány, je jasné, že velikost řetězce je omezena jedině velikostí paměti, kterou pro něj lze alokovat.

Inicializace řetězce při definici

Není překvapením, že řetězce se definují stejně jako pole. Pouze je třeba dát si pozor na to, abychom při definování velikosti nezapomněli na znak EOS. I pole prvků char lze samozřejmě inicializovat při definici, a to stejným způsobem jako obyčejná pole, tedy výčtem jednotlivých prvků:

char string[]={'p','o','l','e','\0'};
Jednotlivé znakové konstanty představují ascii hodnoty, které jsou do pole string uloženy. Jako poslední znak pak nesmíme zapomenout vložit znak EOS. Tento způsob inicializace ale není zrovna moc pohodlný, a tak je možné při definici inicializovat přímo řetězcovou konstantou:
char string[]="pole";
Tento zápis je zcela ekvivalentní s předchozím. Pro pole string je vyhrazeno 5 bytů, do kterých je uložen řetězec „pole“ včetně znaku EOS.

Práce s řetězci

Protože řetězce jsou vlastně jen obyčejná pole, není možné je přiřazovat, sčítat je, ani provádět s nimi jiné podobné operace. Naštěstí jazyk C nabízí pro tyto účely již předdefinované funkce, jejichž služeb můžeme využít.

Kopírování, porovnávání a spojování řetězců

Ve funkcích, o kterých bude v této části řeč, se jako parametry předávají pole. Prozatím bez vysvětlení ponecháme způsob, jakým se předávání polí provádí. Dnes nám postačí vědět, že předáváme-li pole pomocí parametru funkce, nevytváří se jeho lokální kopie, ale pracuje se přímo s předaným polem. Jakákoliv změna provedená uvnitř funkce na tomto poli se tedy projeví i na skutečném parametru funkce.

Kopírování řetězců

char *strcpy(char cil[], char zdroj[])
Pro kopírování jednoho řetězce do druhého je v C připravena funkce strcpy, která má dva argumenty, řetězce cil a zdroj. Bez ohledu na obsah a velikost řetězce cil je do něho postupně, znak po znaku, kopírován obsah řetězce zdroj, a to až do doby kdy se narazí na znak EOS. Tento znak je posledním zkopírovaným znakem. Při používání funkce strcpy je nutné zajistit, aby pole cil mělo vždy dostatečnou velikost na to, aby se do něj řetězec zdroj vešel. To ale platí i pro většinu ostatních funkcí pracujících s řetězci. Návratovou hodnotou funkce strcpy je ukazatel na řetězec cil, ale protože o souvislosti polí s ukazateli si povíme až někdy jindy, můžeme prozatím tuto informaci pominout.

Ukažme si, příklad toho, jak by funkce strcpy mohla být vnitřně implementována:

char *strcpy(char cil[], char zdroj[])
{ unsigned int i=0;
  do { cil[i]=zdroj[i];
       i++;
  } while (zdroj[i-1] != '\0');
  return cil;
}

Spojování řetězců

Ke spojování řetězců můžeme použít funkci strcat:

char * strcat (char cil[], char zdroj[])
Tato funkce jednoduše připojí řetězec zdroj za řetězec cil. Stejně jako u funkce strcpy, ani u strcat se neberou ohledy na skutečnou velikost paměti alokované pro pole cil. To musí být dostatečně velké, aby pojalo oba řetězce cil a zdroj i se znakem EOS.

Zjišťování délky řetězce

int strlen(char str[])
Pro zjišťení délky řetězce nám jazyk C nabízí funkci strlen, která jako svou návratovou hodnotu vrací délku řetězce, který jí byl předán parametrem.

Porovnávání dvou řetězců

int strcmp (char str1[], char str2[])
Funkce strcmp porovnává řetězce str1 a str2 a vrací zápornou hodnotu v případě, že řetězec s1 je lexikograficky menší než řetězec s2 a kladné číslo v případě, že s1 je větší než s2. Jsou-li oba řetězce stejné, je funkcí vrácena hodnota 0.

př:

char s1[]="retezec";
char s2[]="pole";
char s3[20];

strcpy(s3, s1);           //zkopíruje s1 do s3
strcat(s3, " a ");        //připojí řetězec " a " k s3
strcat(s3, s2);           //připojí řetězec s2 k s3
//v proměnné s3 je teď uložen řetězec "retezec a pole";
printf("%d", strlen(s3)); // vypíše délku řetězce s3, číslo 14
Kromě dnes jmenovaných existují i další funkce pro práci s řetězci, těmi se ale již nebudeme zabývat. Odkazuji proto čtenáře třeba na nápovědu vašeho překladače, kde popisy zbylých funkcí jistě snadno najdete. Jejich názvy začínaji na "str".

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » C/C++  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: