Znaki w C
- Znaki kodowane są liczbami całkowitymi od 0 do 127 zgodnie z kodem ASCII
- Typ znakowy char służy do reprezentowania pojedynczych znaków. Zmienna typu char ma rozmiar 1 bajta i zawiera liczbę całkowitą z zakresu od -128 do 127
- Pojedynczy znak zapisany w apostrofach
'A'
odpowiada liczbie z kodu ASCII, np. znak'A'
to 65 a znak'\n'
(nowa linia) to liczba 10 - Używając funkcji
printf()
iscanf()
znaki formatujemy za pomocą%c
Poniższy przykład wyświetla wartość odpowiadającą znakowi 'A'
oraz znak odpowiadający liczbie 'A'+1
.
- 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); }
Program wyświetli następujący komunikat:
A 65 B 66 * 42
Ćwiczenie: kod ASCII
Wypisz wszystkie znaki kodu ASCII wraz z odpowiadającymi im wartościami liczbowymi (od 0 do 127). Liczby wypisz w formacie dziesiętnym, szesnastkowym i ósemkowym, tak aby uzyskać tabelę podobną do poniższego fragmentu:
Znak Dec Hex Oct ────────────────────── ... X 88 58 130 Y 89 59 131 Z 90 5A 132 [ 91 5B 133 \ 92 5C 134 ] 93 5D 135 ^ 94 5E 136 _ 95 5F 137 ` 96 60 140 a 97 61 141 b 98 62 142 c 99 63 143 ...
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 z terminala znak
EOF
uzyskujemy wciskającCtrl+d
(Unix/Linux) lubCtrl+z
(MS Windows) - Funkcja
putchar(int a)
wypisuje pojedynczy znak na standardowym wyjściu - Funkcje
getchar()
iputchar()
zadeklarowane są w plikustdio.h
Przykład:
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
Ćwiczenie: małe na duże
Napisz funkcję o nazwie male_na_duze
, która zamienia małą literę na wielką literę.
Argumenty funkcji:
- pojedynczy znak
Wartość zwracana funkcji:
- pojedynczy znak, jeżeli wejściowy znak jest małą literą (
a-z
) to zwracana jest odpowiadająca mu duża litera. W przeciwnym wypadku zwracany jest ten sam znak (brak zamiany).
Wykorzystaj funkcję male_na_duze
do napisania programu, który zamienia tekst wprowadzony na standardowym wejściu w taki sposób, że wszystkie małe litery będą zamienione na wielkie litery. Tekst wejściowy czytany jest aż do napotkania znaku EOF
.
Przykład: dla tekstu podanego na wejściu
Ala ma kota, a KOT ma Ale i zyc bez siebie nie moga wcale. 123 (!@#)
program generuje następujące wyjście
ALA MA KOTA, A KOT MA ALE I ZYC BEZ SIEBIE NIE MOGA WCALE. 123 (!@#)
Biblioteka ctype.h
Plik nagłówkowy ctype.h
zawiera deklaracje funkcji służących do klasyfikacji znaków.
Zobacz: 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
.
- 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; }
Ćwiczenie: Licz znaki
Napisz program, który po wczytaniu tekstu ze standardowego wejścia wyświetla następujące informacje:
- ilość przeczytanych znaków (wszystkich, także białych i niewidocznych),
- ilość przeczytanych wyrazów,
- ilość linii tekstu,
- ilość małych liter
a-z
, - ilość dużych liter
A-Z
, - ilość cyfr
0-9
.
Przy liczeniu wyrazów 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'
.
Zauważ, że wyrazy nie muszą składać się tylko z liter alfabetu. Zwróć uwagę na to, że w tekście
mogą wystąpić wyrazy oddzielone kilkoma następującymi po sobie białymi znakami oraz, że białe znaki mogą występować na początku linii (np. wcięcie kodu).
Przykładowo dla wprowadzonego teksu:
Ala ma kota, a KOT ma Ale i zyc bez siebie nie mogą 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 wyznacza liczbę wystąpień liter alfabetu w podanym tekście. Tekst czytany jest ze standardowego wejścia aż do końca pliku (EOF
). Po wczytaniu tekstu program wyświetla listę liter
alfabetu angielskiego w kolejności alfabetycznej od a
do z
, które pojawiły się w tekście, wraz z ilością wystąpień każdej z liter. Program nie rozróżnia wielkości liter, tj. zarówno mała litera 'a'
oraz wielka litera 'A'
traktowane są jako wystąpienie tej samej litery alfabetu. Dodatkowo, obok liczby wystąpień litery, program podaje częstość (w procentach) z jaką znak pojawił się w tekście. Częstość podawana jest z dokładnością do 2 miejsc po przecinku.
Przykładowo dla wprowadzonego teksu:
Ala ma kota, a KOT ma Ale i zyc bez siebie nie moga wcale. 123 (!@#)
program wypisze
a 9 20.93 b 2 4.65 c 2 4.65 e 6 13.95 g 1 2.33 i 4 9.30 k 2 4.65 l 3 6.98 m 3 6.98 n 1 2.33 o 3 6.98 s 1 2.33 t 2 4.65 w 1 2.33 y 1 2.33 z 2 4.65
Rozwiązanie (plik źródłowy) umieść w Moodle pod adresem https://moodle.umk.pl/WFAIIS/mod/assign/view.php?id=7547