A1PRG - Programování – Seminář
Ing. Michal Heczko [email protected]
Standardní knihovní funkce pro práci s textovými řetězci 11
Verze 2009.01
Agenda
Znak Řetězec Definice řetězce Práce s řetězci – vstup a výstup Funkce pro práci s řetězci
Znak
Datový typ char
Uložení jednoho znaku – ukládá se ve formátu celého čísla odpovídající kódu v ASCII tabulce
Příklad:char x = ´N´;
Řetězec
Jednorozměrné pole složené z prvků datového typu char.
Pro každý řetězec je rezervovaný určitý blok paměti.
Řetězec je zakončen speciálním znakem ‘\0’.
Znaky za ‘\0’ jsou neaktivní.
Řetězec
Příklad: Je definován řetězec o délce 8 znaků, který
obsahuje text „TEXT“ Obsah paměti bude vypadat následovně:
0 1 2 3 4 5 6 7
T E X T \0
Řetězec
Definice řetězce Statická
Bez inicializacechar retezec[10]; S inicializacíchar retezec1[10] = ″text″;
char retezec2[] = ″text″; Dynamickáchar *retezec;
retezec = (char *) malloc(10);
Řetězec
Řetězci nelze přiřadit konstantní hodnotu:
char str[10];
str = ″text″;
Nutno použít funkci strcpy():char str[10];
strcpy(str,″text″);
Práce s řetězcem
Načtení řetězce z terminálu:scanf(″%s″,&retezec);
Není nutno zadávat ukončovací znak ‘\0’, ten je doplněn automaticky.
Přečte řetězec ukončený bílým znakem (např. znak enter, ale i mezera).
Pokud je nutné načíst řetězec včetně mezer, možno použít funkci gets()
Práce s řetězcem
Výpis řetězce na terminál:printf(″%s″,retezec);
Práce s řetězcem
Příklad:#include <stdio.h>
#include <stdlib.h>
int main()
{
char *jmeno;
if ((jmeno = (char *) malloc(20)) == NULL)
{
printf(″Nedostatek pameti″);
return 1;
}
...
Práce s řetězcem
Příklad:...
printf(″Zadejte sve jmeno: ″);
scanf(″%s″, jmeno);
printf(″Vase jmeno je %s″, jmeno);
free(jmeno);
return 0;
}
Přístup k jednotlivým znakům Řetězec je pole, takže k jednotlivým znakům
se přistupuje jako k prvkům pole. Na konec však nutno doplnit ukončovací znak.
Příklad:char text[11];
for (int i = 0; i < 10; i++)
{
text[i] = ‘x’;
}
text[10] = ‘\0’;
Funkce pro práci s řetězci
Hlavičkový soubor <string.h>
Zjištění délky řetězce:int strlen(char *s); Vrátí délku (počet znaků) řetězce bez
ukončovacího znaku. Návratová hodnota: počet znaků Příklad:
strlen(″ahoj″); // výsledek: 4
Funkce pro práci s řetězci
Hlavičkový soubor <string.h>
Kopírování řetězce:char *strcpy(char *s1, char *s2); Zkopíruje obsah řetězce s2 do řetězce s1. Návratová hodnota: ukazatel na začátek
řetězce s1 Příklad:
strcpy(str, ″ahoj″);
Funkce pro práci s řetězci
Hlavičkový soubor <string.h>
Kopírování řetězce:char *strcat(char *s1, char *s2); Připojí obsah řetězce s2 k řetězci s1. Návratová hodnota: ukazatel na začátek
řetězce s1 Příklad:
strcat(str, ″ahoj″);
Funkce pro práci s řetězci
Hlavičkový soubor <string.h>
Nalezení znaku v řetězci:char *strchr(char *s, char c); Návratová hodnota: Ukazatel na první výskyt
znaku c v řetězci s nebo hodnota NULL. Příklad:
char str[10] = ″ahoj″;strchr(str, ‘x’); // Výsledek: NULL
Funkce pro práci s řetězci
Hlavičkový soubor <string.h>
Nalezení podřetězce v řetězci:char *strstr(char *s1, char *s2); Návratová hodnota: Ukazatel na první výskyt
podřetězce s2 v řetězci s1 nebo hodnota NULL.
Příklad:char str[10] = ″ahoj″;strstr(str, ″xy″); // Výsledek: NULL
Funkce pro práci s řetězci
Hlavičkový soubor <string.h>
Porovnání dvou řetězců:int *strcmp(char *s1, char *s2); Návratová hodnota: Vrátí 0, pokud jsou
řetězce shodné, záporné číslo, pokud je s1 lexiograficky menší, kladné, pokud je větší.
Funkce pro práci s řetězci
Hlavičkový soubor <string.h>
Práce s omezenou částí řetězce: Funkce mají v názvu znak n. Pracují pouze s
prvními n znaky
Př.:char *strncpy(char *s1, char *s2, int max);
Funkce pro práci s řetězci
Hlavičkový soubor <string.h>
Práce s řetězcem pozpátku: Funkce mají v názvu znak r. Pracují s
řetězcem zprava doleva.
Př.:char *strrchr(char *s, char c);
Funkce pro práci s řetězci
Hlavičkový soubor <stdlib.h>
Převod řetězce na celé číslo:int atoi(char *s);
Vrací celočíselnou hodnotu obsahu řetězce. Zkratka z Ascii TO Int. Př.:char cislo[] = ″241″;
int hodnota;
hodnota = atoi(cislo);
Funkce pro práci s řetězci
Hlavičkový soubor <stdlib.h>
Převod řetězce na dlouhé celé číslo:long atol(char *s);
Vrací celočíselnou hodnotu obsahu řetězce. Zkratka z Ascii TO Long. Př.:char cislo[] = ″241″;
long hodnota;
hodnota = atol(cislo);
Funkce pro práci s řetězci
Hlavičkový soubor <stdlib.h>
Převod řetězce na racionální číslo:double atof(char *s);
Vrací hodnotu obsahu řetězce. Hodnota datového typu racionální číslo s dvojitou přesností.
Zkratka z Ascii TO Float. Př.:char cislo[] = ″241.1″;
double hodnota;
hodnota = atof(cislo);
Testování tříd znaků
Hlavičkový soubor <ctype.h>
Všechny makra pro testování tříd znaků jsou zapsány ve tvaru:istypznaku(znak);
Návratovou hodnotou je 0, pokud se nejedná o daný typ znaku, v opačném případě nenulová hodnota.
Testování tříd znaků
Hlavičkový soubor <ctype.h>
Makro Kdy vrací nenulovou hodnotu
isalnum(z); … číslice, malé nebo velké písmeno
isalpha(z); … malé nebo velké písmeno
isdigit(z); … číslice
islower(z); … malé písmeno
isprint(z); … tisknutelný znak (včetně mezery)
isspace(z); … mezera, tabulátor nebo konec řádku
isupper(z); … velké písmeno
isxdigit(z); … hexadecimální číslice
Konverze znaku
Hlavičkový soubor <ctype.h>
Všechny makra pro konverzi znaku jsou zapsány ve tvaru:totypznaku(znak);
Návratovou hodnotou je znak převedený na daný typ znaku.
Konverze znaku
Hlavičkový soubor <ctype.h>
Makro Popis
toupper(z); … převod na velké písmeno
tolower(z); … převod na malé písmeno
A1PRG-s 11. Řetězce
Děkuji za pozornost
Ing. Michal Heczko
218/U3
Prezentace k dispozici na http://vyuka.fai.utb.cz