Edytuj stronę Odnośniki Fold/unfold all ODT export Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. ====== Znaki w C ====== * Znaki kodowane są liczbami całkowitymi od 0 do 127 zgodnie z [[https://pl.wikipedia.org/wiki/ASCII|kodem ASCII]] * Typ znakowy **char** służy do reprezentowania pojedynczych znaków. Zmienna typu **char** ma rozmiar 1 bajta może reprezentować liczby z zakresu od -128 do 127 * Pojedynczy znak zapisany w apostrofach '' 'A' '' odpowiada wartości całkowitej z kodu ASCII, np. znak '' 'A' '' to 65 a znak '''\n''' (nowa linia) ma wartość 10 * Używając funkcji '''printf()'' i ''scanf()'' znaki formatujemy za pomocą ''%c'' Poniższy przykład wyświetla wartość odpowiadającą znakowi '''A''' oraz znak odpowiadający liczbie '''A'+1 ''. <file c znak.c> #include<stdio.h> 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); } </file> Program wyświetli następujący komunikat: <code> A 65 B 66 * 42 </code> ===== Funkcja getchar() i putchar() ===== * Funkcja ''getchar()'' zwraca pojedynczy znak pobrany ze standardowego wejścia (z terminala) lub wartość ''EOF'', gdy napotka koniec strumienia (//end of file//) * Podczas wprowadzania 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 * Funkcje ''getchar()'' i ''putchar()'' zadeklarowane są w pliku ''stdio.h'' Przykład: <file C cat.c> #include <stdio.h> int main() { char a; while((a=getchar()) != EOF) putchar(a); return 0; } </file> Powyższy program kopiuje na wyjście wszystkie znaki wprowadzone na wejściu. Program działa aż do momentu napotkania końca strumienia (pliku). Stosując przekierowanie strumienia wejściowego, można powyższy program wykorzystać do wyświetlenia zawartości dowolnego pliku, np. wydając w terminalu polecenie: <code> $ program < plik_wejsciowy </code> Przekierowując wyjście z programu do pliku możemy skopiować dowolny plik <code> $ program < plik_wejsciowy > plik_docelowy </code> **Przykład:**\\ Poniższy program zamienia małe litery od ''a'' do ''z'' na duże litery od ''A'' do ''Z''. <file C male_na_duze.c> #include <stdio.h> int male_na_duze(int znak) { if ( znak >= 'a' && znak <= 'z' ) { return znak - ('a' - 'A'); } return znak; } int main() { int a; while( (a = getchar()) != EOF ) { a = male_na_duze(a); putchar(a); } return 0; } </file> ===== Biblioteka ctype.h ===== Plik nagłówkowy ''ctype.h'' zawiera deklaracje funkcji służących do klasyfikacji znaków. Zobacz: [[https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#ctype.h|ctype.h]] Oto lista wybranych funkcji z ''ctype.h'' | ''isalpha()'' | czy znak przekazany jako argument literą alfabetu | | ''isdigit()'' | czy znak przekazany jako argument jest cyfrą | | ''isalnum()''' | czy znak przekazany jako argument jest cyfrą lub literą alfabetu | | ''isprint()'' | czy znak przekazany jako argument jest znakiem drukowalnym | | ''isspace()'' | czy znak przekazany jako argument jest białym znakiem | | ''islower()'' | czy znak przekazany jako argument jest małą literą alfabetu | | ''isupper()'' | czy znak przekazany jako argument jest dużą literą alfabetu | | ''tolower()'' | zwraca znak zamieniony z dużej litery na małą | | ''toupper()'' | zwraca znak zamieniony z małej litery na dużą | **Przykład** Poniższy przykład zawiera program realizujący zamianę znaków z małych na duże z użyciem funkcji zadeklarowanych w ''ctype.h''. <file C toupper.c> #include <stdio.h> #include <ctype.h> int main() { int a; while( (a = getchar()) != EOF ) { if ( islower(a) ) a = toupper(a); putchar(a); } return 0; } </file> ==== Zadanie - Licz znaki i linie ==== Napisz program, który po wczytaniu tekstu ze standardowego wejścia wyświetla następujące informacje: * ilość przeczytanych znaków, * ilość przeczytanych wyrazów, * ilość linii tekstu, * ilość małych liter ''a-z'', * ilość dużych liter ''A-Z'', * ilość cyfr ''0-9''. Zakładamy, że wyrazem jest ciąg znaków oddzielony przynajmniej jednym białym znakiem, tj. spacją, znakiem nowej linii '' '\n' '' lub znakiem tabulacji '' '\t' ''. Takie wyrazy nie muszą składać się wiec tylko z liter. Zwróć uwagę na to, że w tekście mogą wystąpić wyrazy oddzielone kilkoma następującymi po sobie białymi znakami. Przykładowo dla wprowadzonego teksu: <code> Ala ma kota, a KOT ma Ale i zyc bez siebie nie moga wcale. 123 (!@#) </code> program wypisze <code> znaki 69 wyrazy 16 linie 3 duze litery 5 male litery 38 cyfry 3 </code> ==== Zadanie - Licz litery alfabetu ==== Napisz program, który po wczytaniu tekstu ze standardowego wejścia wyświetli listę wszystkich liter alfabetu od ''a'' do ''z'', które występują w tekście wraz z ilością wystąpień każdej z liter. Wynik nie powinien rozróżniać wielkości liter, tj. zarówno mała litera '''a''' oraz duża litera '''A''' traktowane są jako wystąpienie tej samej litery alfabetu. Przykładowo dla wprowadzonego teksu: <code> Ala ma kota, a KOT ma Ale i zyc bez siebie nie moga wcale. 123 (!@#) </code> program wypisze <code> a 9 b 2 c 2 e 6 g 1 i 4 k 2 l 3 m 3 n 1 o 3 s 1 t 2 w 1 y 1 z 2 </code> ==== Zadanie - Leet speak ==== Napisz program, który przetransformuje tekst podany na standardowym wejściu do postaci //hack mowy// (zob. [[wppl>Leet_speak|leet speak]]) zgodnie regułami podanymi w poniższej tabeli. Wszystkie pozostałe znaki pozostają w swojej niezmienionej formie. Wynik wypisz na standardowym wyjściu. ^ Znak wejściowy ^ Znak wyjściowy ^ | ''a A'' | ''4'' | | ''b B'' | ''8'' | | ''c C'' | ''('' | | ''e E'' | ''3'' | | ''g G '' | ''6'' | | ''i I '' | ''|'' (kreska pionowa)| | ''l L '' | ''1'' (cyfra jeden) | | ''o O'' | ''0'' (cyfra zero) | | ''s S '' | ''5'' | | ''z Z '' | ''2'' | Przykładowo dla wprowadzonego teksu: <code> Ala ma kota, a KOT ma Ale i zyc bez siebie nie moga wcale. 123 (!@#) </code> program wypisze <code> 414 m4 k0t4, 4 K0T m4 413 | 2y( 832 5|38|3 n|3 m064 w(413. 123 (!@#) </code>