====== 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 ''.
#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);
}
Program wyświetli następujący komunikat:
A 65
B 66
* 42
===== 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:
#include
int main()
{
char a;
while((a=getchar()) != EOF)
putchar(a);
return 0;
}
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:
$ program < plik_wejsciowy
Przekierowując wyjście z programu do pliku możemy skopiować dowolny plik
$ program < plik_wejsciowy > plik_docelowy
**Przykład:**\\
Poniższy program zamienia małe litery od ''a'' do ''z'' na duże litery od ''A'' do ''Z''.
#include
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;
}
===== 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''.
#include
#include
int main()
{
int a;
while( (a = getchar()) != EOF )
{
if ( islower(a) ) a = toupper(a);
putchar(a);
}
return 0;
}
==== 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:
Ala ma kota, a KOT ma Ale
i zyc bez siebie nie moga wcale.
123 (!@#)
program wypisze
znaki 69
wyrazy 16
linie 3
duze litery 5
male litery 38
cyfry 3
==== 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:
Ala ma kota, a KOT ma Ale
i zyc bez siebie nie moga wcale.
123 (!@#)
program wypisze
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
==== 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:
Ala ma kota, a KOT ma Ale
i zyc bez siebie nie moga wcale.
123 (!@#)
program wypisze
414 m4 k0t4, 4 K0T m4 413
| 2y( 832 5|38|3 n|3 m064 w(413.
123 (!@#)