{{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
++++