====== 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]]