Řetězec - další nástroje pro práci s textem
Práci s řetězci nám ulehčí funkce ze standardní knihovny string.h (viz Řetězce - funkce). V jazyce C máme ale další možnosti, jak zpracovat textové hodnoty uložené v řetězcích.
tolower() | převede znak na malé písmeno | ctype.h |
toupper() | převede znak na velké písmeno | ctype.h |
isdigit() | testuje, zda znak je číslice | ctype.h |
isalpha() | testuje, zda znak je písmeno | ctype.h |
atoi() | převede řetězec na celé číslo | stdlib.h |
atof() | převede řetězec na reálne číslo | stdlib.h |
Funkce z hlavičkového souboru ctype.h pracují s jednotlivým znakem. Pokud je chceme použít pro zpracování znaků v řetězci, musíme (podobně jako v běžném poli) projít postupně všechny znaky v řetězci.
Ukážeme si, jak napsat funkci, která změní první písmeno ve jménu na velké a všechna ostatní písmena převede na malá. Parametrem funkce bude řetězec (pole znaků). Funkce nemusí mít n8vratovou hodnotu, protože řetězec (jako každé pole) je vstupem a zároveň výstupem ve funkci. Využijeme dále funkce se standardních knihoven.
#include <string.h> #include <ctype.h> void upravit_jmeno(char jm[]) { int i, delka; delka = strlen(jm); jm[0] = toupper(jm[0]); //zmeni prvni pismeno na velke for(i=1; i < delka; i++) //projdeme vsechny dalsi znaky { jm[i] = tolower(jm[i]); //zmeni na male pismeno } }
Následuje ukázka použití naší funkce:
char jmeno[30];
printf("Zadejte jmeno: ") ;
gets (jmeno) ;
upravit_jmeno(jmeno);
printf("Vase jmeno je %s\n", jmeno);
Pokročilé zpracování řetězců
V této kapitole si ukážeme, jak můžeme zpracovat znaky v textu bez použití knihoven string.h a ctype.h. Jako příklad si vytvoříme funkci z předchozího příkladu - funkce změní první písmeno na velké a ostatní písmena na malá.
void upravit_jmeno2(char jm[]) { int i; if (jm[0] >= 'a' && jm[0] <= 'z') //kdyz je to male pismeno { jm[0] = jm[0] - 32; //zmeni prvni pismeno na velke } for(i=1; jm[i] != '\0'; i++) //projdeme vsechny znaky az po nulovy ynak { if (jm[i] >= 'A' && jm[i] <= 'Z') //kdyz je to velke pismeno { jm[i] = jm[i] + 32; //zmeni na male pismeno } } }
Uvedený kód lze dále vylepšit. Pro převod písmen (velká/malá) si můžeme taky vytvořit vlastní funkce.
POLE ŘETĚZCŮ
Když chceme uložit do proměnné více čísel, použijeme pole. Podobně, když chceme více textů (řetězců) uložit do jedné proměnné, můžeme taky použít pole. Protože samotný řetězec je taky pole, dostáváme "pole polí" nebo taky, jinak řečeno, dvourozměrné pole.
//v promenne hesla muze byt 10 hesel, kazde muze obsahovat max. 20 znaku
char hesla[10][20];
//deklarace s inicializaci
// hned si nastavime, jaka slova tam budou (v prikladu je 6 slov)
char slovicka[10][15]={"motorka", "auto", "vlak", "letadlo", "raketa", "parnik"};
Rozebereme si více druhou deklaraci, kde do proměnné slovicka hned vložíme 6 slov. Dvourozměrné pole slovicka si můžeme představit jako tabulku, která má 10 řádků a 15 sloupců. V každém řádku je zapsáno jedno slovo - na prvním řádku:motorka, na druhém: autobus atd. Každé slovo může mít maximálně 15 znaků (písmen). Po deklaraci je obsazeno 6 řádků, máme tedy ještě volný prostor pro vložení dalších 4 slov.
Při použití proměnné slovicka v programu můžeme pracovat samostatně s jednotlivými slovy. Zápis slovicka[0] zastupuje první slovo v poli tj. "motorka" a zápis slovicka[3] pro nás potom představuje celý zapsaný text "letadlo" (pozor: číslování je zas od 0).
//ukazka casti programu
//postupne vypiseme vsechna slova z promenne slovicka
char slovicka[10][15]={"motorka", "auto", "vlak", "letadlo", "raketa", "parnik"};
int i, pocet_slov = 6;
printf("Ulozena slova : \n");
for( i=0; i < pocet_slov; i++)
{
printf(" %s\n", slovicka[i]) ;
}
Můžeme pracovat i s jednotlivými písmeny ve slovech. Tento postup je ale méně obvyklý. Zápis slovicka[3][4] potom zastupuje písmeno d ve slově "letadlo" .