====== Znaki i łańcuchy znaków (stringi) =====
===== Znaki w C =====
* Znaki kodowane są liczbami całkowitymi 0-127 zgodnie z [[https://pl.wikipedia.org/wiki/ASCII|kodem ASCII]]
* Typ znakowy **char**, zmienna tego typu jest liczbą całkowitą
* Pojedynczy znak w kodzie w apostrofach '' 'A' '' odpowiada wartości całkowitej z kodu ASCII
* Formatowanie znaków w ''printf'' i ''scanf'' za pomocą ''%c''
Przykład:
#include
int main()
{
char znak = 'A';
printf("%c %d\n", znak, znak);
printf("%c %d\n", znak+1, znak+1);
printf("%c %d\n", 42, 42);
}
{{zajecia:pp1_2019_1:str1.c|str1.c}}
===== Funkcja getchar() =====
* funkcja ''getchar()'' zwraca pojedynczy znak ze standardowego wejścia lub wartość ''EOF'' gdy napotka koniec strumienia (//end of file//)
* przy wprowadzaniu danych ze standardowego wejścia ''EOF'' uzyskujemy wciskając ''Ctrl+d'' (Unix/Linux) lub ''Ctrl+z'' (MS Windows)
* funkcja ''putchar(int a)'' wypisuje pojedynczy znak na standardowym wyjściu
Przykład:
#include
int main()
{
char a;
while((a=getchar()) != EOF)
putchar(a);
return 0;
}
{{zajecia:pp1_2019_1:str2.c|str2.c}}
==== Zadanie - Licz znaki ====
Napisz program, który po wczytaniu tekstu ze standardowego wejścia wyświetli ilość znaków oraz linii w podanym tekście.
Przykładowo, dla wprowadzonego teksu:
Ala ma kota, a kot ma Alę
i żyć bez siebie nie mogą wcale,
program wypisze
znakow 63
linii 2
==== Zadanie - Małe na duże ====
Napisz program, który zamienia wszystkie małe znaki alfabetu na duże litery, zaś duże - na małe.
Wszystkie znaki interpunkcyjne i pozostałe symbole pozostają niezmienione.
Przykład:
AlA mA_kota !231
aLa Ma_KOTA !231
===== Napisy - łancuchy znakowe =====
* napis to tablica zawierająca ciąg znaków zakończony wartością 0 (znak '' '\0' '')
* dowolny ciąg znaków w cudzysłowach jest stałym napisem, np.: ''"Ala ma kota"''
* formatowane wyświetlanie napisu ''printf()'' za pomocą modyfikatora ''%s''
Przykład:
#include
int main()
{
char *napis = "Ala ma kota\n";
while(*napis != '\0')
{
printf(napis);
napis++;
}
return 0;
}
{{zajecia:pp1_2019_1:str3.c|str3.c}}
==== Zadanie - Czytaj linię ===
Zaimplementuj funkcję o nazwie ''readline'', która odczytuje pojedynczy wiersz tekstu ze standardowego wiersza i umieszcza go w tablicy znakowej w postaci napisu.
Funkcja ta realizuje bezpieczną wersję funkcji [[http://pl.wikibooks.org/wiki/C/gets|gets()]], zabezpieczając procedurę wczytywania tekstu przed możliwością przepełnienia tablicy.
Funkcja nie wczyta więcej niż ''n'' znaków oraz przerywa wczytywanie po napotkaniu końca pliku ''EOF''.
Do wczytywania kolejnych znaków ze standardowego wejścia użyj funkcji ''[[http://pl.wikibooks.org/wiki/C/getchar|getchar()]]''.
Ostatni znak linii (znak nowego wiersza - '''\n''') nie powinien występować w utworzonym napisie.
**Argumenty funkcji:** tablica znakowa ''t'' oraz liczba całkowita ''n'' określająca maksymalną liczbę znaków jaka może zostać wczytana do tablicy ''t''\\
**Wartość zwracana:** funkcja zwraca wartość EOF (-1), gdy w czasie czytania znaków napotkano koniec pliku, w przeciwnym wypadku wartość zwracaną jest liczba 1
Napisz program, który używając funkcji ''readline'', czyta kolejno wszystkie linie tekstu ze standardowego wejścia. Każdorazowo po wczytaniu kolejnej linii tekstu jest ona wyświetlana na standardowym wyjściu (na ekranie).
==== Zadnie - Szyfr cezara ====
Zaimplementuj funkcję ''szyfr()'', która zaszyfruje tekst umieszczony w napisie za pomocą szyfru Cezara. Szyfr ten zamienia znaki alfabetu na znaki stojące o 3 pozycje dalej w alfabecie, tzn. ''a'' zamieniane jest na ''d'', litera ''b'' na ''e'', itd. Litera ''z'' zamieniana jest na ''a'', ''y'' na ''b'', ''z'' na ''c''. Zamianie ulegają wyłącznie znaki alfabetu (małe ''a-z'' i duże ''A-Z'').
**Argumenty funkcji:** tablica znakowa ''t'' zawierająca napis do zaszyfrowania \\
**Wartość zwracana:** adres tablicy 't' zawierającej zaszyfrowany tekst \\
Napisz program, który przeczyta linię tekstu (wykorzystaj do tego funkcję ''readline()'' z poprzedniego zadania) a następnie wypisze jego zaszyfrowaną postać.
Przykład:
Ala ma kota
Dkd pd nsxd
**Dla chętnych**
* rozszerz funkcję ''szyfr()'' o możliwość zamiany znaków w tekście na znaki przesunięte o dowolną liczbę całkowitą w alfabecie. Liczba ta podana jest w dodatkowym argumencie funkcji. Znaki w alfabecie zamieniane są cyklicznie. Podanie wartości ujemnej odpowiada przesunięci znaków w przeciwną stronę w alfabecie i w efekcie deszyfrację wiadomości zakodowanej wartością dodatnią.
* niech program działa nieprzerwanie dla dowolnej liczby wprowadzonych linii aż do pojawienia się pustej linii. Każda kolejna linia wypisywana jest w zaszyfrowanej postaci.
==== Biblioteka string.h ====
Wybrane funkcje z biblioteki [[http://www.cplusplus.com/reference/cstring/|string.h]]
* strlen() - długość napisu \\ int strlen(char *napis)
* strcpy() - kopiowanie napisu \\ char* strcpy(char *src, char* dest)
* strcmp() - porównywanie napisów w porządku alfabetycznym \\ int strcmp(char *napis1, char* napis2)
* strcat() - łączenie napisów \\ char* strcat(char *src, char* dest)
* strstr() - znajdź podciąg znaków \\ char* strstr(char *napis, char* wzor)
==== Biblioteka ctype.h ===
Wybrane funkcje w biblioteki [[https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#ctype.h|ctype.h]]
* islower(), isupper() - czy mała litera/czy duża litera
* tolower(), toupper() - zamiana na małe litery/duże litery
==== Zadanie - Cenzura =====
Napisz funkcję o nazwie ''cenzura()'', która wyszukuje w podanym napisie pewnego wyrażenia i jeżeli wyrażenie występuje w tekście to znaki tego wyrażenia zostają zamienione na ''*'', tj. słowo zostaje ocenzurowane.
**Argumenty funkcji:** dwa napisy, pierwszy zawiera tekst do ocenzurowania a drugi to wyraz, który będzie cenzurowany. \\
**Wartość zwracana:** adres tablicy zawierającej ocenzurowany napis\\
Napisz program, który wypisuje na ekranie kolejne linie tekstu podane przez użytkownika. Jeżeli tekst w danej linii zawiera wyraz ''abakus'', ''wtorek'' lub ''czerwony'' to tekst zostaje ocenzurowany a na ekranie pojawia się linia w której znaki niepożądanego słowa zostają zastąpione znakiem ''*''.
Przykład:
We wtorek Adam kupil czerwony abakus.
We ****** Adam kupil ******** ******.