====== 9 - Textové řetězce ====== ===== Procvičovaná témata ===== * Textový řetězec jako pole znaků * Porovnávání řetězců * Kopírování řetězců ===== Teoretická příprava ===== * [[http://www.asciitable.com/|ASCII tabulka]] * Délka textového řetězce: [[http://www.tutorialspoint.com/c_standard_library/c_function_strlen.htm|strlen]] size_t strlen(const char *str) * Porovnání řetězců: [[http://www.tutorialspoint.com/c_standard_library/c_function_strcmp.htm|strcmp]], [[http://www.tutorialspoint.com/c_standard_library/c_function_strncmp.htm|strncmp]] int strcmp(const char *str1, const char *str2) int strncmp(const char *str1, const char *str2, size_t n) ===== Úkoly ===== * Definujte textový řetězec "Everybody likes PRPA" a vypište ho. Následně vypište z tohoto řetězce pouze "likes PRP" a nakonec řetězec změňte na "Tom likes PRPA" a vypište ho. Přemýšlejte, jak to provést nejúsporněji. * Naprogramujte funkce strlen, strcmp a strncmp. === cat === * Naprogramujte zjednodušenou verzi programu ''cat''. Načtěte vstup ze stdin a zase ho vypište na výstup (stdout). echo "Hello world" | cat Hello world * Upravte program tak, aby vypsal vstup až za první mezerou: echo "Hello world" | cat2 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''). echo "Hello world and hello again " | 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' nejak označte. echo "Hello world and hello again " | words-len Hello 5 world 5 and 3 <-- hello 5 again 5 * Zkuste si pospojovat dnešní programy. Např.: echo "Hello world and hello again " | words | cap hELLO WORLD AND HELLO AGAIN * Načtěte vstup a vypište ho s malými písmeny přepsanými na velké a naopak echo "Hello world" | cap hELLO WORLD === tr === * Nyní zkuste zjednodušenou verzi programu ''tr''. Program bude mít zadány dva argumenty na příkazové řádce, které budou sloužit jako předpis pro překlad znaků viz. následující příklad: echo "Hello world" | tr 'Hl' 'Xk' Xekko workd echo "Hello world" | tr 'dweji' '01234' H2llo 1orl0 ===== Ukázkové příklady ===== ==== 1. příklad ==== #include #include int main() { char a[] = "ahoj"; // 'a', 'h', 'o', 'j', '\0' // 0x61, 0x68, ... printf("%s\n", a); printf("delka retezce: sizeof %lu, strlen %lu\n", sizeof(a), strlen(a)); int I = strlen(a); for (int i = 0; i < I; i++) printf("%c (%x) ", a[i], a[i]); printf("\n"); char b[] = "Everybody likes PRP!"; int tiskni = 0, mezera = 0; I = strlen(b); for (int i = 0; i < I; i++) { if (b[i] == ' ' && tiskni == 0) { tiskni = 1; mezera = i + 1; break; } if (tiskni == 1) printf("%c", b[i]); } printf("\n"); printf("%s\n", b+10); return 0; } ==== 2. příklad ==== #include int mystrcmp(char *a, char *b) { // int i = 0; while (*(a+i) != '\0' || b[i] != '\0') { if (a[i] != *(b+i)) return 1; i++; } return 0; } int main() { char text1[] = "Ahoj svete"; char text2[] = "Ahoj svete"; printf("Retezce %s stejne.\n", (mystrcmp(text1, text2))?"nejsou":"jsou"); return 0; } ===== Řešené příklady ===== * [[courses:b0b99prpa:solutions:lab08|8 - Textové řetězce 1/2]] * [[courses:b0b99prpa:solutions:lab10|10. Textové řetězce 2/2]]