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