280 likes | 358 Views
Verze 2009.01. Standardní knihovní funkce pro práci s textovými řetězci. 11. A1PRG - Programování – Seminář Ing. Michal Heczko heczko@fai.utb.cz. 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
E N D
Verze 2009.01 Standardní knihovní funkce pro práci s textovými řetězci 11 A1PRG - Programování – Seminář Ing. Michal Heczko heczko@fai.utb.cz
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ě:
Řetězec • Definice řetězce • Statická • Bez inicializace char 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: intstrlen(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: charstr[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: charstr[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: intatoi(char *s); • Vrací celočíselnou hodnotu obsahu řetězce. • Zkratka z Ascii TOInt. • Př.: charcislo[] = ″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 TOLong. • Př.: charcislo[] = ″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 TOFloat. • Př.: charcislo[] = ″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>
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>
A1PRG-s 11. Řetězce Děkuji za pozornost Ing. Michal Heczko heczko@fai.utb.cz 218/U3 Prezentace k dispozici na http://vyuka.fai.utb.cz