{{indexmenu_n>6}} ====== Lab 06 - Textové řetězce ====== * [[courses:b3b36prg:internal:tutorialinstruction:06|pro vyučující]] ===== Cíle cvičení ===== - Textové řetězce. ==== Materiály ==== * [[https://en.wikipedia.org/wiki/ASCII|ASCII tabulka]] * Délka textového řetězce: [[https://en.cppreference.com/w/cpp/string/byte/strlen|strlen]] * Porovnání řetězců: [[https://en.cppreference.com/w/c/string/byte/strcmp|strcmp]], [[https://en.cppreference.com/w/c/string/byte/strncmp|strncmp]] ====== Textové řetězce ====== * Definujte textový řetězec "Everybody likes PRG" a vypište ho. Následně vypište z tohoto řetězce pouze "likes PRG" a nakonec řetězec změňte na "Tom likes PRP" a vypište ho. Přemýšlejte, jak to provést nejúsporněji. * Naprogramujte funkce odpovídající funkcím ''strlen'', ''strcmp'' a ''strncmp'', např. pojmenované ''my_strlen''. ===== Implementace variant programu cat ===== * Naprogramujte zjednodušenou verzi programu ''cat'', např. pojmenovanou ''cat-basic''. Načtěte vstup ze stdin a zase ho vypište na výstup (stdout). ++++ Příklad výstup cat-basic | echo "Hello world" | cat-basic Hello world ++++ * Upravte program tak, aby vypsal vstup až za první mezerou , ''cat-skip'' ++++ Příklady výstupu cat-skip | echo "Hello world" | cat-skip world ++++ * Vypište každe slovo ze vstupu na samostatný řádek (za oddělovače slov považujte mezeru, konec řádku ''\n'' a tabulátor ''\t''). ++++ Příklad výstupu cat-words | echo "Hello world and hello again " | cat-words Hello world and hello again ++++ * Nyní zkuste totéž, ale za každé slovo vypište i jeho délku a slova "and" a "or" označte. ++++ Příklad výstupu cat-words-len | echo "Hello world and hello again " | cat-words-len Hello 5 world 5 and 3 <-- hello 5 again 5 ++++ ===== Načtení textového řetězce ===== * Definujte pole znaků fixní velikosti např. int str[STRING_LEN + 1]; a realizujte načtení textového řetězce ze standardního vstupu jako řádku zakončeného znakem ''\n'', např. funkcí ''getchar()'', podobně jako v předchozích příkladech. * Pokud by načítaný počet znaků překročil ''STRING_LEN'', reportujte chybu vstupu a ukončete program s návratovou hodnotu ''EXIT_FAILURE''. * V programu dále uvažujte maximální počet slov ''#define MAX_WORDS 64'' a vytvořte pole ukazatelů na řetězce incializované na nulu. char *words[MAX_WORDS] = {}; * Předchozí příklady ''cat-words'' a ''cat-words-len'' implementujte tak, že jednotlivá slova budou odkazována z proměnné ''words'' a v načteném řetězci budou slova oddělena znakem konce řetězce. ++++ Příklad | /* Nechtě obsah pole str odpovídá posloupnosti znaků 'H', 'e', 'l', 'l', 'o', '\0', 'w', 'o', 'r', 'l', 'd', '\0', ' ', ' ', 'a', 'n', 'd', '\0. Pak prvky pole words odpovídají následujícím adresám. */ words[0] == &str[0]; words[1] == &str[6]; // přístup jako do pole words[2] == str + 14; // přístup ukazatelovou (pointerovou) aritmetikou. ++++ * Definici hodnot maker ''STRING_LEN'' a ''MAX_WORDS'' realizujte tak, aby bylo možné hodnoty definovat při překladu programu, např. clang -DSTRING_LEN=128 cat.c -o cat a program otestujte pro různé varianty hodnot a vstupů tak, aby došlo k detekci chyby vstupu ++++ Příklad definice makra STRING_LEN| #ifndef STRING_LEN #define STRING_LEN 256 #endif ++++ ===== Implementace variant programu tr ===== * Načtěte vstup a vypište jej s malými písmeny přepsanými na velké a naopak ++++ Příklad výstupu programu cap| echo "Hello world" | cap ===== hELLO WORLD ++++ * Nyní zkuste zjednodušenou verzi programu ''tr-simple''. Program bude mít zadány dva argumenty na příkazové řádce, které budou sloužit jako předpis pro překlad znaků. ++++ Příklad výstupu tr-simple| echo "Hello world" | tr-simple 'Hl' 'Xk' Xekko workd echo "Hello world" | tr-simple 'dweji' '01234' H2llo 1orl0 ++++ * Zkuste si pospojovat dnešní programy. ++++ Příklad výstupu | echo "Hello world and hello again " | cat-words | cap hELLO WORLD AND HELLO AGAIN ++++