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 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 .

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
  • 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:

cat.c
#include <stdio.h>
 
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.

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;
}

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;
}

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. 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 (!@#)