Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
"
"
"
"
O Autorze .............................................................................................................9
Wstp ................................................................................................................11
Rozdzia 1. Protokoy komunikacyjne .................................................................15
Krtka historia Internetu ...................................................................................................15
IP Internet Protocol ................................................................................................16
Datagramy IP transportowanie, rozmiar i fragmentacja ........................................18
Adresy IP, klasy i maski podsieci ...............................................................................21
VLSM krtka instrukcja tworzenia podsieci i odczytywania adresu IP ................22
ARP/RARP rozpoznawanie adresu sprztowego.........................................................31
ARP transportowanie, budowa nagwka pakietu .................................................31
RARP transportowanie, dokonywanie transakcji ..................................................33
Usuga RARP..............................................................................................................33
TCP Transmission Control Protocol ............................................................................33
Sekwencje oraz okna...................................................................................................34
Budowa nagwka pakietu TCP..................................................................................35
Porty, kocwki, nawizywanie poczenia ...............................................................37
UDP User Datagram Protocol ......................................................................................37
Budowa i transportowanie datagramw UDP.............................................................38
Multiplexing, demultiplexing oraz porty UDP ...........................................................39
ICMP Internet Control Message Protocol....................................................................39
Budowa i transportowanie pakietw ICMP................................................................39
Komunikaty ICMP, wyszukiwanie maski podsieci ....................................................40
Przykady datagramw ICMP.....................................................................................42
Spis treci
5
date............................................................................................................................171
del (erase)..................................................................................................................172
dir ..............................................................................................................................172
diskcomp ...................................................................................................................173
diskcopy ....................................................................................................................174
exe2bin......................................................................................................................174
exit.............................................................................................................................175
fastopen .....................................................................................................................175
fc ...............................................................................................................................175
fdisk...........................................................................................................................177
find ............................................................................................................................177
format........................................................................................................................178
graftabl ......................................................................................................................179
Graphics ....................................................................................................................179
join ............................................................................................................................180
keyb...........................................................................................................................181
label...........................................................................................................................182
mkdir (md) ................................................................................................................182
mode..........................................................................................................................183
more ..........................................................................................................................186
nlsfunc.......................................................................................................................186
path............................................................................................................................187
print ...........................................................................................................................187
prompt .......................................................................................................................188
recover.......................................................................................................................189
rename (ren) ..............................................................................................................190
replace .......................................................................................................................190
restore........................................................................................................................191
rmdir (rd)...................................................................................................................192
select .........................................................................................................................192
set ..............................................................................................................................193
share ..........................................................................................................................194
sort.............................................................................................................................194
subst ..........................................................................................................................195
sys .............................................................................................................................196
time ...........................................................................................................................196
tree.............................................................................................................................197
type............................................................................................................................197
ver .............................................................................................................................197
verify .........................................................................................................................198
vol .............................................................................................................................198
xcopy.........................................................................................................................198
Spis treci
7
Krok 1. Rozpoznanie ................................................................................................394
Krok 2. Uszczegowienie danych ...........................................................................394
Krok 3. Rozpoczcie waciwego ataku ...................................................................397
Krok 4. Poszerzenie wyomu ....................................................................................397
Krok 5. Hakowanie strony.....................................................................................397
Rozdzia 11. TigerSuite kompletny pakiet narzdzi do badania i ochrony sieci ...605
Terminologia ...................................................................................................................605
Wprowadzenie.................................................................................................................607
Instalacja ...................................................................................................................610
Moduy ............................................................................................................................613
Moduy grupy System Status ....................................................................................614
TigerBox Tookit..............................................................................................................619
TigerBox Tools .........................................................................................................619
TigerBox Scanners....................................................................................................624
Skorowidz.........................................................................................................701
Rozdzia 6.
Jzyk C
Dla kadego hakera, modego czy starego, mniej lub bardziej dowiadczonego, znajomo jzyka C jest jednym z fundamentw wiedzy. Niemal wszystkie narzdzia
i programy, stosowane w trakcie analiz sieci i wama, powstaj wanie w tym jzyku. Rwnie w niniejszej ksice wikszo przedstawianego kodu to wanie kod
rdowy w jzyku C. Programy te mona modyfikowa, dostosowywa do wasnych
potrzeb i odpowiednio kompilowa.
W pracy nad niniejszym rozdziaem wykorzystano obszerne fragmenty pracy guru
programowania Matthew Proberta. Maj one peni funkcj wprowadzenia do programowania w jzyku C i umoliwi stosowanie przedstawianych w ksice (i zaczonych na CD-ROM-ie) listingw programw. Peny kurs jzyka znajdziesz w niejednej ksice wydawnictwa Helion.
202
Wersje jzyka C
W pierwotnej edycji jzyka C (jeszcze przed publikacj Kernighana i Ritchieego,
The C Programming Language, Prentice-Hall 1988 (polskie wydanie: Jzyk ANSI C,
Wydawnictwa Naukowo-Techniczne 1994)) zintegrowane operatory przypisania (+=,
*= itd.) definiowane byy odwrotnie (tj. =+, =* itd.). Znakomicie utrudniao to interpretacj wyrae takich jak:
co mogoby znaczy
lub
dugoci,
J wprowadzenia sowa kluczowego (dla funkcji, ktre nie zwracaj wartoci)
i typu dla oglnych zmiennych wskanikowych,
J wprowadzenie w preprocesorze mechanizmw scalania cigw, wklejania
203
jzykw narodowych,
J wprowadzenie sowa kluczowego
(jako uzupenienie sowa
,
Klasyfikowanie jzyka C
Szerokie moliwoci jzyka C, dopuszczenie bezporedniego operowania na adresach
i danych w pamici oraz strukturalne podejcie do programowania sprawiaj, e jzyk
ten klasyfikuje si jako jzyk programowania redniego poziomu. Znajduje to wyraz
w mniejszej liczbie gotowych rozwiza ni w jzykach wysokiego poziomu, takich
jak BASIC, ale wyszym poziomie strukturalnym ni niskopoziomowy Assembler.
Sowa kluczowe
Pierwotna edycja jzyka C definiuje 27 sw kluczowych. Komitet ANSI doda do
nich 5 nowych. Wynikiem s dwa standardy jzyka, cho norma ANSI przeja wikszo elementw od Kerninghana i Ritchieego. Oto lista:
Warto zwrci uwag, e niektre kompilatory C wprowadzaj dodatkowe sowa kluczowe, specyficzne dla rodowiska sprztowego. Warto zapozna si z nimi.
Struktura jzyka C
Jzyk C wymaga programowania strukturalnego. Oznacza to, e na program skada
si pewna grupa nawzajem wywoujcych si blokw kodu. Dostpne s rnorodne
polecenia suce do konstruowania ptli i sprawdzania warunkw:
204
Instrukcje wewntrz nawiasw klamrowych wykonane zostan tylko wtedy, gdy speniony zostanie warunek .
Jako kolejny przykad przedstawimy peny blok kodu funkcji, zawierajcy wewntrz
blok ptli:
%&'()
"
#
"
*+,
! !*#
*-*.#
$
!//0 !#
#
$
Zwrmy uwag, e kady wiersz instrukcji zakoczony jest rednikiem, o ile nie jest
sygnaem pocztku bloku kodu (w takim przypadku kolejnym znakiem jest nawias
klamrowy). Jzyk C rozpoznaje wielko liter, ale nie bierze pod uwag biaych znakw. Odstpy midzy poleceniami s pomijane, std konieczno uycia rednika,
aby oznaczy koniec wiersza. Tego rodzaju podejcie powoduje, e nastpujce polecenia interpretowane s jako identyczne:
!#
!#
!#
205
"
$
Komentarze
Podobnie jak wikszo jzykw, C pozwala umieszcza w kodzie programu komentarze. Ich ogranicznikami s symbole i :
34'5
56 743
Biblioteki
Programy w jzyku C kompiluje si i czy z funkcjami bibliotecznymi, dostarczanymi wraz z kompilatorem. Na biblioteki skadaj si funkcje standardowe, ktrych
dziaanie zdefiniowane zostao w normie ANSI. Ich powizanie z konkretnym kompilatorem zapewnia dostosowanie do platformy sprztowej. Wynika std, e standardowa
funkcja biblioteczna dziaa tak samo w systemach DEC VAX i IBM PC,
cho rni si jej, zapisany w bibliotece, kod maszynowy. Programista C nie musi zagbia si w zawarto bibliotek, wymagana jest jedynie umiejtno ich stosowania
i znajomo dziaania funkcji, ktre pozostaj niezmienne na kadym komputerze.
Tworzenie programw
Kompilacja
Zanim zajmiemy si funkcjami, poleceniami, sekwencjami i innymi zaawansowanymi
zagadnieniami, przyjrzyjmy si praktycznemu przykadowi, w ktrym doprowadzimy
do skompilowania kodu. Kompilowanie programw C jest stosunkowo prost czynnoci, jednak rni si zalenie od stosowanego kompilatora. Kompilatory wyposaone
w menu umoliwi skompilowanie, skonsolidowanie i uruchomienie programu jednym wciniciem klawisza. Podchodzc jednak do zagadnienia moliwie uniwersalnie i tradycyjnie, przeprowadzimy poniej ca procedur w oparciu o wiersz polece.
W dowolnym edytorze wprowadzamy poniszy fragment kodu i zapisujemy plik jako
przyklad.c:
34
;
43
206
Typy danych
W jzyku C wyrnia si cztery podstawowe typy danych: znakowy, cakowity,
zmiennoprzecinkowy i nieokrelony. Odpowiadaj im sowa kluczowe:
, ,
i . Dalsze typy danych tworzy si na tej podstawie, dodajc modyfikatory:
(ze znakiem),
(bez znaku), (duga) i (krtka). Modyfikator
jest elementem domylnym, co sprawia, e jego uycie moe si okaza
konieczne jedynie w wypadku gdy zastosowano przecznik kompilacji nakazujcy
domylne korzystanie ze zmiennych bez znaku. Rozmiar kadego typu danych zaley
od platformy sprztowej, jednak norma ANSI wyznacza pewne zakresy minimalne,
zestawione w tabeli 6.1.
W praktyce tak okrelone konwencje oznaczaj, e typ danych
nadaje si najlepiej do przechowywania zmiennych typu znacznikowego, takich jako kody stanu,
o ograniczonym zakresie wartoci. Mona rwnie korzysta z typu . Gdy jednak
zakres wartoci nie przekracza 127 (lub 255 dla
), kada deklarowana
w ten sposb zmienna przyczynia si do niepotrzebnego obciania pamici.
Natomiast trudniejsze jest pytanie o to, z ktrego typu liczb rzeczywistych korzysta
,
czy
. Gdy wymagana jest dokadno, na przykad
w aplikacji stosowanej w ksigowoci, instynktownie powinnimy uy typu
,
207
Rozmiar
Zakres
128 do 127
0 do 255
16
32 768 do 32 767
16
0 do 65 535
32
32
32
precyzja 6-cyfrowa
64
precyzja 10-cyfrowa
80
precyzja 10-cyfrowa
Deklarowanie zmiennej
Kada zmienna musi zosta zadeklarowana przed uyciem. Ogln postaci deklaracji zmiennej jest:
#
Aby wic przykadowo zadeklarowa zmienn typu , przeznaczon do przechowywania wartoci z zakresu od 32 768 do 32 767, uyjemy instrukcji:
#
Tablice danych innych typw mog mie wicej ni jeden wymiar. Oto deklaracja
dwuwymiarowej tablicy liczb cakowitych:
? !@? !@#
208
209
"
I!!!#
$
Zmienna moe przechowywa wartoci z zakresu od 127 do 128, a wic warto 5000
nie zostanie przypisana. przyjmie jednak warto 136.
Potrzeba przypisania rnych typw danych nie jest niczym oryginalnym. Aby powstrzyma kompilator od generowania ostrzee o takich operacjach, mona skorzysta z instrukcji konwersji (cast statement), informujc kompilator o tym, e operacja
wykonywana jest wiadomie. Instrukcj tak budujemy, umieszczajc przed zmienn
lub wyraeniem nazw typu danych ujt w nawiasy:
"
#
#
!!31I#
#
$
Parametry formalne
Funkcja w jzyku C moe przyjmowa parametry przekazywane przez funkcj wywoujc. Parametry te deklaruje si podobnie jak zmienne, podajc ich nazwy wewntrz towarzyszcych nazwie funkcji nawiasw:
JKLM
"
34MGE
8
43
4#
$
"
#
#
#
I#
N#
JKLM
#
*--G6-+*
#
$
210
Modyfikatory dostpu
Stosuje si dwa modyfikatory dostpu: i
. Warto zmiennej zadeklarowanej jako nie moe zosta zmieniona przez program, warto zmiennej zadeklarowanej jako
moe zosta zmieniona przez program. Dodatkowo, zadeklarowanie zmiennej jako
uniemoliwia kompilatorowi zaalokowanie jej
do rejestru i ogranicza przeprowadzan na niej optymalizacj.
Operatory
Operatory to elementy kodu, ktre nakazuj wykonanie oblicze na zmiennych. W jzyku C dostpne s nastpujce:
.
adres,
porednio,
plus jednoargumentowy,
minus jednoargumentowy,
dopenienie bitowe,
>
negacja logiczna,
HH
PP
dodawanie,
odejmowanie,
mnoenie,
dzielenie,
przesunicie w lewo,
00
przesunicie w prawo,
..
//
przypisanie,
4
przypisanie iloczynu,
3
przypisanie ilorazu,
-
H
przypisanie sumy,
przypisanie rnicy,
00
.
/
Q
mniejsze ni,
wiksze ni,
0
rwne,
>
rne od,
0
RS
jeeli
to prawda, to , w przeciwnym razie %&
?@
definiowanie tablic,
222
211
212
Pozostae operatory matematyczne wykorzystujemy podobnie. Warto jednak pamita o wprowadzanych przez jzyk C moliwociach zapisu skrconego:
Zapis typowy
Zapis w j+zyku C
H
HH
41
41
3
3
-I
-I
Funkcje
Funkcje to procedury kodu rdowego tworzce program w jzyku C. Ich ogln postaci jest:
"
$
to typ zwracanej przez funkcj wartoci:
, ,
, itp.
Kod wewntrz funkcji C pozostaje niewidoczny dla innych funkcji C. Nie mona wykonywa skokw z jednej funkcji do wntrza innej. Funkcje mog jedynie wywoywa inne funkcje. Nie wolno rwnie definiowa funkcji wewntrz innych funkcji.
Definicja musi zosta umieszczona bezporednio na poziomie moduu kodu.
,
213
#$
nie zmienia wartoci otrzymanych parametrw. Modyfikowana jest zawarto wskazywanych parametrami adresw pamici. O ile #$
otrzymuje
z funkcji
wartoci zmiennych i %, #$
otrzymuje z funkcji
ich
adresy w pamici.
214
Parametr funkcji, '(, jest tablic dowolnej dugoci. Deklaracja taka jest moliwa, poniewa kompilator przekazuje jedynie adres pocztkowy tablicy, a nie wartoci
poszczeglnych jej elementw. Konsekwencj tego jest fakt, e funkcja moe zmienia wartoci elementw tablicy. Aby uniemoliwi funkcji wprowadzanie modyfikacji, konieczne jest uycie typu :
5
?@
"
$
Przy takiej deklaracji wiersz zmieniajcy zawarto tablicy wywoaby bd kompilacji. Okrelenie parametru jako wartoci staej nie likwiduje jednak porednioci jego
przekazania. Ilustruje to poniszy program:
<
20
5
?@
"
4
#
#
34' 5
8U
U43
34
5V43
345
V
43
#
!# !!#HH
"
4
#
HH#
$
$
"
215
? !!@#
#
5
#
!# !!#HH
*+,
BE
--*
?@#
$
Parametr
przechowuje liczb przekazanych programowi parametrw. W tablicy
216
Wyj#cie z funkcji
Polecenie
powoduje natychmiastowe wyjcie z funkcji. Jeeli w deklaracji
funkcji podano typ zwracanej wartoci, w poleceniu
naley uy parametru tego samego typu.
Prototypy funkcji
Prototypy funkcji umoliwiaj kompilatorowi C sprawdzanie poprawnoci przekazywanych, do i z funkcji, danych. Ma to istotne znaczenie jako zabezpieczenie przed
przekroczeniem zakresu zaalokowanego dla zmiennej obszaru pamici. Prototyp funkcji
umieszcza si na pocztku programu po poleceniach preprocesora (takich jak
)
i przed deklaracjami funkcji.
Polecenia preprocesora C
W jzyku C w treci kodu rdowego mona umieszcza polecenia dla kompilatora.
Okrela si je terminem polecenia preprocesora. Norma ANSI definiuje nastpujce:
<
<
<
<
<
<
<
<
<
<
<
<
217
#define
Polecenie
tworzy identyfikator, ktry kompilator zastpi podanym cigiem
w danym module kodu rdowego. Na przykad:
<TDZF&!
<'[Y&>TDZF&
podlega modyfikacji.
Polecenie
moe rwnie zosta uyte do definiowania makr, take makr z parametrami. Do zapewnienia poprawnoci zastpie zaleca si ujmowanie parametrw
w nawiasy. W poniszym przykadzie deklarujemy makro o nazwie
, przyjmujce dwa parametry i zwracajce ten z nich, ktrego warto jest wiksza.
<
20
<
0
RS
"
*+-5
6*IN#
$
#error
Polecenie
powoduje przerwanie procesu kompilacji i wywietlenie podanego
tekstu, na przykad:
<F\LJ9]ZL,DK&XLJLXYZY:
#include
Polecenie
nakazuje kompilatorowi odczytanie i przetworzenie zawartoci
dodatkowego pliku rdowego. Nazwa pliku musi zosta ujta w cudzysw lub
wstawiona midzy znaki 5, na przykad:
< * 12*
<
20
Jeeli nazwa pliku zostaa wpisana midzy znaki 5, kompilator wyszukuje go w katalogu okrelonym w konfiguracji. Jest to zasada oglna.
218
#ifdef, #ifndef
Rozwiniciem tych polece jest
(jeeli zdefiniowano) i
(jeeli nie zdefiniowano). Konstrukcje skadniowe s nastpujce:
<
<
<
<
<
<
#undef
Polecenie
usuwa definicj makra utworzonego przy uyciu wczeniejszej instrukcji
.
#line
Polecenie
modyfikuje zmienne globalne kompilatora )).670)) i )),6.0)).
Ogln postaci instrukcji jest:
<
*
*
219
#pragma
Umoliwia korzystanie z polece specyficznych dla kompilatora.
Instrukcje steruj"ce
Jak w kadym jzyku programowania, rwnie w C, znajdziemy instrukcje sprawdzajce warto wyraenia. Wynikiem takiego sprawdzenia jest warto 1230 lub ,-./0.
Wartoci ,-./0 odpowiada liczba , a 1230 liczba rna od zera.
gdzie
moe by instrukcj pojedyncz lub ujtym w nawiasy klamrowe
blokiem kodu. Element
jest opcjonalny. Jeeli wartoci jest 1230,
wykonywana jest instrukcja podana bezporednio po nim. W pozostaych przypadkach
wykonywana jest instrukcja podana po sowie
(o ile ta cz skadni zostaa uyta).
Alternatyw dla konstrukcji +++
jest polecenie 9: w postaci:
Jeeli wartoci wyraenia jest 1230, wykonywana jest pierwsza instrukcja. W pozostaych przypadkach wykonywana jest instrukcja druga. Ilustruje to przykad:
<
20
"
#
W#
*+
-*-1!R*
*S*
*#
$
220
Uycie instrukcji
# nie jest wymagane, ale jej pominicie powoduje dalsze porwnywanie wyraenia z kolejnymi elementami listy wartoci.
<
20
"
#
W#
"
!S
*+G6*#
#
S
*+G65*#
#
1S
*+G6*#
#
AS
*+G6
*#
#
S
*+5
6
*#
$
$
Instrukcje iteracji
W jzyku C stosuje si trzy instrukcje ptli (iteracji): , "
i ;"
. Skadnia
ptli jest nastpujca:
#
#
Jest ona szczeglnie przydatna, gdy korzystamy z licznika, jak w poniszym przykadzie wywietlajcym zestaw znakw ASCII:
<
20
"
#
A1# 1^#HH
*-+
-+
*#
$
221
##
"
$
Jzyk C pozwala uywa te pustych instrukcji. Ponisza ptla usuwa z cigu pocztkowe znaki odstpu:
#4
UU#
HH
#
Instrukcje skoku
Instrukcja
pozwala powrci z funkcji wykonywanej do funkcji, z ktrej ta zostaa wywoana. W zalenoci od zadeklarowanego typu wartoci zwracanej przez
funkcj instrukcja
moe wymaga odpowiedniego parametru:
JYZ'
"
4#
$
lub
5
"
*+=,*#
#
5
92:2
$
Instrukcja
# suy do wychodzenia z ptli lub instrukcji ". W przypadku ptli powoduje to jej przedwczesne zakoczenie, jak w poniszym przykadzie:
<
20
"
#
222
Uzupenieniem
# jest polecenie
, wymuszajce przeprowadzenie nastpnej iteracji ptli. Kolejn wykonywan instrukcj jest w tym przypadku instrukcja ptli (dalsze instrukcje w iterowanym bloku s pomijane). Dostpna jest rwnie funkcja przedwczesnego zakoczenia wykonywania programu
. Mona za jej
pomoc przekaza warto zwracan do programu wywoujcego:
#
Continue
Sowo kluczowe
nakazuje skok do instrukcji kontrolnej ptli. W przypadku
ptli zagniedonych jest to instrukcja ptli wewntrznej ("
, +++"
). To sposb na agodne zakoczenie ptli jak w poniszym przykadzie, gdzie odczytujemy
zapisane w pliku cigi:
<
20
"
T]Z&4#
4#
? !!@#
*2
***#
KYZZ
"
*K8
E
2
*#
!#
$
"
!!#
KYZZ
34, 5B43
#
#
$
#
$
223
Wej#cie-wyj#cie
Pobieranie danych
Program w jzyku C moe pobiera dane z konsoli (ktra jest standardowym urzdzeniem wejciowym), pliku lub portu. Oglnym poleceniem odczytu danych ze standardowego strumienia wejciowego jest
. Skanuje ono po jednym znaku
kolejne pola wejciowe. Podlegaj one formatowaniu zgodnie z pierwszym z przekazanych funkcji
parametrw. Nastpnie pole zostaje zapisane pod adresem przekazanym jako kolejny parametr wywoania funkcji. Przykadowy program odczytuje
pojedyncz liczb cakowit ze strumienia :
"
#
*-*.#
$
Warto zwrci uwag na operator uyty jako prefiks zmiennej na licie parametrw
wywoania funkcji
. Funkcja ta zapisuje bowiem warto pod okrelonym adresem, nie posugujc si mechanizmem przypisywania wartoci zmiennej. Cigiem
formatujcym jest cig znakowy, ktry moe zawiera trzy typy danych: znaki odstpu
(spacja, tabulator, przejcie do nowego wiersza), znaki waciwe (wszystkie znaki ASCII
z wyjtkiem znaku %) i specyfikatory formatowania. Specyfikatory te maj nastpujc skadni:
-?4@?
@?//Z@
Oto przykad:
<
20
"
?A!@#
#
*95*#
*-A!-*.#
*+--*#
$
Zwrmy uwag na wiersz
+5 nakazuje on kompilatorowi przetwarzanie pliku nagwkowego stdio.h, w ktrym zawarte s prototypy funkcji
i . Po uruchomieniu tego prostego programu atwo przekonamy si, e uycie
znaku odstpu przerwie wprowadzanie pierwszego pola danych.
Alternatywn funkcj pobierania danych jest
, odczytujca cig znakw ze strumienia do momentu napotkania znaku nowego wiersza. W cigu docelowym znak
nowego wiersza zastpiony zostaje znakiem 73... Charakterystyczna dla tej funkcji
jest moliwo odczytywania znakw odstpu. Oto nowa wersja powyszego programu
(korzystajca z
w miejsce
):
224
Wyprowadzanie danych
Podstawow funkcj wyprowadzania danych jest . Jest ona podobna do
z t rnic, e zapisuje dane do standardowego strumienia wyjciowego .
Funkcja pobiera list pl danych wyjciowych, odpowiednio stosuje specyfikatory
formatowania i wyprowadza wynik. Mona stosowa takie same przeksztacenia formatujce jak w przypadku funkcji
, jak rwnie dodatkowe znaczniki:
;
Nieco odmienna jest take posta specyfikatora szerokoci. Jest on rozbudowany o element okrelajcy precyzj:
2
225
+
tabulator,
+
+
tabulator pionowy,
++
+U
apostrof,
+*
cudzysw,
+R
znak zapytania,
+
+
Kolejny program ilustruje, w jaki sposb wywietli liczb cakowit w postaci dziesitnej, szesnastkowej i semkowej. Liczba < po znaku procentw (=) w instrukcji
nakazuje kompilatorowi dopenienie wywietlanej liczby do szerokoci co
najmniej czterech cyfr:
349
5
6
43
34
5G543
<
20
"
#
"
*+95
6
!
_E*#
*-*.#
*-!`-!`)-!`*#
$
>!#
$
226
Alternatyw dla jest , funkcja przesyajca prosty cig do strumienia
. Przesyany cig zostaje automatycznie uzupeniony znakiem nowego wiersza.
Jest to rozwizanie szybsze od , jednak jego moliwoci s ograniczone.
Wska%niki
Wskanik to zmienna, ktra przechowuje adres elementu danych w pamici. Deklaracja wskanika jest podobna do deklaracji zwykej zmiennej, ale nazwa poprzedzana
jest znakiem gwiazdki (), na przykad:
4#
227
Funkcja
zwraca wskanik typu , co oznacza, e moe on wskazywa
dane dowolnego typu ,
,
itd. W poniszym przykadzie alokujemy
pami dla tabeli 1000 liczb cakowitych.
<
20
<
20
"
4#
#
345
V
43
34'
6 !!!
C43
34
5
43
34
5
G55
43
!!!4
#
34F5
;43
KYZZ
"
*+K8E6 !!!
5
B
*#
!#
$
349 5
BG
43
!# !!!#HH
"
4#
HH#
$
349
BE C
43
!!!#
34,B
B
43
!# !!!#HH"
*+&
- 5
BE-*4#
HH#
$
349 8 5
643
#
$
228
Wymagan do zaadresowania 1 MB pamici 20-bitow liczb dzieli si na dwie wartoci: przesunicie (offset) i segment (kady segment to 64 kB). Do przechowywania numerw segmentw pamici komputer IBM PC wykorzystuje tzw. rejestry segmentowe.
Konsekwencj takiego rozwizania s w jzyku C trzy dodatkowe sowa kluczowe:
J
wskaniki bliskie maj rozmiar 16 bitw i umoliwiaj dostp
229
Struktury
Jzyk C oferuje technik grupowania zmiennych pod jedn nazw, dostarczajc w ten
sposb wygodnego sposobu przechowywania powizanych ze sob informacji i strukturalizowania ich. Skadnia definicji struktury jest nastpujca:
"
#
$
2
2
2
$
#
Uywanie zmiennych strukturalnych jest niezbdne przy korzystaniu z plikw, w ktrych wystpuje uporzdkowanie oparte na rekordach danych. W poniszym przykadzie operowa bdziemy na prostym pliku z list adresw. Rozpoczniemy od deklaracji struktury
, zoonej z szeciu pl:
!"#,
,
, "$
"!",
!
i
:
"
?A!@#
?A!@#
?A!@#
5
?A!@#
?W@#
? I@#
$
#
2
#
Nie ma ograniczenia liczby pl struktury, nie jest rwnie wymagane, aby typy pl
byy takie same lub podobne, na przyklad:
"
?A!@#
#
4
#
$
#
Jest to poprawna deklaracja struktury obejmujca: pole tablicy znakowej, pole liczby
cakowitej i pole wskanika do zmiennej znakowej. Aby przekaza zmienn strukturaln jako parametr, korzystamy z jej adresu poprzedzamy nazw zmiennej operatorem >. Oto przykadowy program wykorzystujcy struktury w celu wykonania
prostych operacji na pliku listy adresw:
230
"
?A!@#
?A!@#
?A!@#
5
?A!@#
?W@#
? I@#
$
#
#
#
349
543
DXX([&7#
7ZF#
X]F9XD'D#
TD'DZ4#
%&'XD'D#
J&KY#
L9&KXD'D#
F&D[7=#
7ZF
"
#
!#
(#HH
**#
$
TD'DZ4
"
*+:
S-*
#
!#
$
L9&KXD'D
"
34FV
52a8
G243
34a8
G
_ 243
*2
*L([X,[/L(D99&KXF(],[]'&#
231
232
233
DXX([&7#
#
1SF&D[7=
X]F9XD'D#
"
*K]&MKDZ&M]LK&>*#
*,B5&K'&[*#
#
$
#
AS
#
$
$
5>A#
$
"
7ZF#
L9&KXD'D#
J&KY#
$
Pola bitowe
Jzyk C przewiduje moliwo korzystania w strukturach ze zmiennych o rozmiarze
mniejszym ni 8 bitw. Okrela si je mianem pl bitowych, a ich rozmiar moe by
dowolny, od 1 bitu wzwy. Deklaracja pola bitowego wyglda nastpujco:
S #
"
S
S
S
S
$
#
#
#
#
#
#
Zmienna !
!# bdzie zajmowa w pamici tylko 4 bity, mimo e skada si z 4 pl,
z ktrych kade dostpne jest jako osobne pole struktury.
Union
Kolejnym uatwieniem jzyka C, pozwalajcym zapewni optymalne wykorzystanie
dostpnej pamici, jest struktura , czyli zbir zmiennych, wspuytkujcych jeden adres pamici. Oznacza to, oczywicie, e w danym momencie dostpna jest tylko jedna ze zmiennych skadowych. Deklaracja ma nastpujc posta:
234
#
#
2
2
2
#
$#
Wyliczenia
Wyliczenie (enumeracja) to przypisanie licie symboli rosncych wartoci cakowitych. Wyliczenie deklarujemy:
"
$
%#
Operacje na plikach
W operacjach dostpu do plikw jzyk C posuguje si buforowanymi strumieniami
plikowymi. Niektre z platform jzyka, jak UNIX i DOS, oferuj rwnie niebuforowane uchwyty plikw.
Strumienie buforowane
Dostp do strumieni buforowanych realizowany jest za porednictwem wskanika do
zmiennej typu ,6.0. Ten szczeglny typ danych zdefiniowany zosta w nagwku stdio.h. Aby wic zadeklarowa wskanik do pliku, wprowadzamy:
<
20
T]Z&4
#
Aby otworzy strumie, uywamy funkcji . Pobiera ona dwa parametry: nazw otwieranego pliku oraz tryb dostpu. Oto lista trybw dostpu.
235
Tryb
Opis
H
H
H
otwrz do czytania i doczania danych; utwrz nowy plik, jeeli nie istnieje.
Aby okreli tryb tekstowy lub binarny, do opisu trybu mona doczy lub . W przypadku pominicia tego znacznika strumie zostanie otwarty w trybie okrelanym
zmienn globaln )
. Odczyt i zapis danych do strumieni plikowych w trybie tekstowym wie si z konwersj podczas zapisu znaki CR i LF zamieniane s na pary
CR LF, a przy odczycie pary CR LF ulegaj zamianie na pojedynczy znak LF. Tego
rodzaju operacje nie s wykonywane w trybie binarnym.
Jeeli funkcja
nie bdzie moga otworzy pliku, zwrci w miejsce wskanika
warto 73.. (zdefiniowan w stdio.h). Poniszy program utworzy nowy plik dane.txt
i udostpni go do odczytu i zapisu:
<
20
"
T]Z&4#
*2
**H*#
$
Aby zamkn strumie, uywamy funkcji
, wymagajcej podania wskanika
do pliku.
#
Jeeli podczas zamykania strumienia wystpi bd, funkcja
zwrci warto
niezerow (znacznik EOF End Of File). Do przesyania i odbierania danych ze
strumieni su cztery podstawowe funkcje:
, ,
i .
Funkcja
odczytuje pojedynczy znak z okrelonego strumienia wejciowego
(przeksztacany do liczby cakowitej):
T]Z&4#
236
Odczyt zostaje przerwany po pobraniu znakw lub znaku nowego
wiersza (rwnie wstawianego do tablicy). Do odczytanego cigu doczany jest koczcy znak73..!
%
#?
@A*A. W przypadku wystpienia bdw
funkcja zwraca 73...
Funkcja zapisuje do strumienia cig zakoczony znakiem 73.. (inaczej A*A):
4
T]Z&4#
Wszystkie opisywane funkcje zwracaj w przypadku bdw warto 0B, (zdefiniowan w stdio.h) z wyjtkiem funkcji
, ktra w przypadku wystpienia bdu
zwraca 73... Poniszy program tworzy kopi pliku dane.dat, o nazwie dane.old, ilustrujc zarazem uycie wszystkich czterech funkcji:
<
20
"
T]Z&4#
T]Z&4
#
*
2
***#
KYZZ
"
*+K8
E
2
*#
!#
$
*2**H*#
KYZZ
"
*+K8
E 2*#
!#
$
349
5
5
5
G43
348
<43
>
#
34M5
43
#
#
!#
$
237
T]Z&4#
? !!@#
*2
**H*#
"
#
#
$
4
#
#
$
Funkcja zwraca pozycj wskanika pliku, okrelon jako ilo bajtw od pocztku
pliku, lub ; w przypadku bdu.
Uchwyty
Uchwyty plikw (handles) otwiera funkcja
o prototypie:
4
&? @#
L(7[&D'
L('[YK7
L(&)7Z
L(:]KD[b
L('&)'
238
Funkcja podejmuje prb odczytu podanej liczby bajtw i zwraca liczb bajtw faktycznie pobranych przez uchwyt pliku. Odczytane dane umieszczane s w bloku pamici okrelonym parametrem . Funkcja dziaa podobnie, nie rni si
rwnie jej prototyp i sposb generowania wartoci zwracanej. Zapisuje ona podan
ilo bajtw z okrelonego wskanikiem bloku pamici. Pliki otwierane funkcj
zamykamy funkcj
:
%
#
239
Funkcja
suy do zamykania strumienia otwartego wczeniejszym wywoaniem
:
T]Z&4#
Udana operacja
koczy si oprnieniem wszystkich buforw pliku i zwrceniem wartoci . W przypadku bdw zwracana jest warto 0B,.
Wiele komputerw korzysta z buforowanego dostpu do plikw. Oznacza to, e dane,
zapisywane do strumienia, wstpnie umieszczane s w pamici, a faktyczny zapis nastpuje dopiero po przekroczeniu pewnej granicznej iloci bajtw. Jeeli w czasie,
gdy dane nie zostay jeszcze faktycznie zapisane do strumienia, nastpi awaria zasilania, dane zostan utracone. Zabezpiecza przed tym funkcja , wymuszajca
zapisanie wszystkich danych oczekujcych:
T]Z&4#
Jeeli wywoanie jest udane, zwizane ze strumieniem bufory zostaj oprnione i zwracana jest warto . W przypadku bdw funkcja zwraca warto 0B,.
Kolejn funkcj jest
zwracajca lokalizacj wskanika pliku:
T]Z&4#
Funkcja zwraca przesunicie wskanika pliku w stosunku do pocztku pliku lub F.
w przypadku bdw. Przesunicie wskanika pliku do nowej pozycji umoliwia
#:
T]Z&4
#
pocztek pliku,
F&&\(7Y[
F&&\(&KX
koniec pliku.
Funkcja ta dziaa podobnie jak
#&.&/00C)/01. Jednak
# usuwa znacznik 0B,, a
"
#" wszystkie sygnay bdw. Informacje o bdach funkcji plikowych mona pobra przy uyciu funkcji
:
T]Z&4#
240
Sprawdzenie, czy speniony jest warunek osignicia koca pliku, realizuje predefiniowane makro
:
T]Z&4#
Makro zwraca warto niezerow, gdy dla danego strumienia stwierdzono osignicie
koca pliku. W pozostaych przypadkach zwracan wartoci jest .
Dostpnych jest kilka funkcji realizujcych odczyt danych ze strumienia plikowego.
Pojedyncze znaki mona odczytywa funkcj
:
T]Z&4#
zwraca warto ASCII pobranego znaku lub znak 0B, w przypadku wystpienia bdu. Odczyt cigu danych umoliwia funkcja
, odczytujca cig zakoczony znakiem nowego wiersza:
4
'
T]Z&4#
W wyniku udanego wywoania funkcji w zmiennej umieszczany jest cig zakoczony znakiem nowego wiersza lub zawierajcy znakw. Funkcja zachowuje
koczcy cig znak nowego wiersza, doczajc do cigu bajt 73... W przypadku
nieudanego wywoania zwracany jest wskanik pusty. Cigi zapisujemy do strumienia funkcj :
4
T]Z&4#
Funkcja zwraca zapisany znak lub, w przypadku wystpienia bdw, znak 0B,.
Aby odczyta ze strumienia duy blok danych lub rekord, mona posuy si funkcj
:
(
4(
(
T]Z&4#
241
Funkcja zwraca liczb faktycznie odczytanych pl, a 0B, w przypadku koca pliku.
Poniszy przykad ilustruje uyteczno funkcji
podczas odczytywania ze
strumienia liczb:
<
20
"
T]Z&4#
#
#
#
#
#
? !!@#
*2
**H*#
>
"
*K8
E *#
!#
$
* 1A`I+*,
+**#
#
"
*:;C
*
#
#
$
#
"
*:;C5
*
#
#
$
*------*..
...
#
"
*:;C
*
#
#
$
*+T 5G;------*
#
$
Jak atwo zauway, zapis formatowanych danych realizuje funkcja . Gdy
pojawia si potrzeba zapisania pooenia wskanika pliku i pniejszego jego przywrcenia, mona skorzysta z funkcji
i
. Pierwsza z nich odczytuje biec pozycj wskanika pliku:
T]Z&4(
4 #
242
Funkcja zamyka strumie istniejcy i podejmuje prb jego ponownego otwarcia przy
uyciu podanej nazwy pliku. Znajduje to zastosowanie przy przekierowywaniu strumieni predefiniowanych , i
do pliku lub urzdzenia. Przykadowo, gdy pojawia si potrzeba przekierowania wszystkich danych wyjciowych kierowanych do na drukark, mona uy polecenia:
*Z9' ***
#
243
244
Ci"gi
Jzyk C naley do najlepiej wyposaonych w funkcje obsugi cigw pord uniwersalnych jzykw programowania. Cig to jednowymiarowa tablica znakw zakoczona bajtem zerowym. Cigi mona inicjowa dwoma sposobami. Pierwszym jest
nadanie im staej wartoci w kodzie programu:
"
4*F
I*#
?@*9
*#
!#
$
245
<
20
4
"
4#
#
4
"
40gN..4 11
4
4#
HH#
$
$
4
"
4#
#
4
"
40WI..4g!
4
4#
HH#
$
$
"
?I!@#
*FF
*#
*+,
BEC UU
-*#
#
*+,
BEC UU
-*#
#
*+,
BEC UU
-*#
!#
$
' ;
2T 5
C
;
5C55
EVG;2\5
6
56
B A1
5
G865C
;2aB
5
65 8
C
C586
2,
hFi
hAi2, 5
;
6
;
2S
4
"
40gN..4 11
4
4#
HH#
246
W przeciwiestwie do innych jzykw programowania C nie narzuca ograniczenia dugoci cigu. Jednak w przypadku niektrych procesorw (CPU) pojawia si ograniczenie wielkoci bloku pamici. Oto prosty program odwracajcy kolejno znakw w cigu:
<
20
<
20
4
4
"
34L5BEGC
5C543
34_KYZZ43
4#
4#
#
34Y
VUU
C 43
H
#
34M
VC
C 43
#
34M43
0
"
4#
44#
4
#
#
HH#
$
#
$
"
? !!@#
4#
*'5
C*#
#
*+-*#
$
247
strtok()
Funkcja # jest istotn funkcj jzyka C, suc do wyczania fragmentw
cigu. Stosuje si j, gdy poszczeglne podcigi rozdzielone s znanymi ogranicznikami, na przykad przecinkami:
<
20
<
20
"
?I!@#
4#
*7M&[,LKb9LJD[Dj7ML,bklc'bM]&ZLKbK]&:]&F\]*#
**#
"
#
KYZZ**#
$#
$
248
249
250
Obsuga tekstu
Czowiek zapisuje informacje jako pewien tekst, zoony ze sw, liczb i znakw
przestankowych. Sowa zoone s z liter wielkich i maych, odpowiednio do wymaga gramatyki. Wszystko to sprawia, e komputerowe przetwarzanie tekstu nie jest
251
zadaniem prostym. Norma ANSI definiuje wiele funkcji przetwarzania cigw znakowych, ktre z natury rozpoznaj wielko liter. Oznacza to, e litera A rozpoznawana jest jako rna od a. Jest to pierwsze zagadnienie, ktrego rozwizanie
musi znale programista pracujcy nad programem przetwarzajcym tekst. Na szczcie, zarwno kompilatory Borlanda, jak i Microsoftu wyposaone zostay w funkcje
obsugi cigw, ktre nie rozpoznaj wielkoci liter.
Tak odmian funkcji jest , a . Gdy jednak pojawia si kwestia przenonoci kodu, niezbdna jest zgodno z ANSI C, co
pociga za sob napisanie wasnych funkcji.
Poniej przedstawiamy prost implementacj nierozrniajcej wielkoci liter odmiany funkcji . Tworzy ona kopie cigw, zamienia je na wielkie litery i wykonuje standardow operacj . Pozwala to okreli poszukiwan warto przesunicia i utworzy wskanik do cigu rdowego.
4
4 41
"
? !!!@#
1? !!!@#
4#
#
11#
#
1#
1#
H #
KYZZ#
$
Kolejna funkcja przeglda cig , wyszukujc sowo podane jako G. Aby funkcja
zwrcia warto 1230, znalezione musi zosta odrbne sowo, a nie jedynie sekwencja znakw. Wykorzystujemy przygotowan wczeniej funkcj .
(4 41
"
34
BEC5815
;
43
4#
4m#
#
!#
m #
"
34Z 5
C5G1 43
m1#
"
252
253
! #
H
H #
$
$
Data i godzina
Jzyk C wyposaony jest w funkcj
, ktra odczytuje zegar systemowy komputera i podaje informacj o dacie i godzinie w postaci liczby sekund, ktra upyna
od pnocy 1 stycznia 1970 roku. Warto ta moe zosta zamieniona na czytelny dla
czowieka cig znakw za pomoc funkcji
:
<
20
<
20
"
34F
243
(
#
349
66
43
KYZZ#
*:8C
S-+*
.
#
$
254
Uzupenieniem jest znak nowego wiersza i kocowe 0. Poniewa pola maj sta szeroko, cig zwracany przez
idealnie nadaje si do operacji wymagajcych
wyodrbnienia elementw daty lub godziny. W poniszym programie definiujemy
struktur !
oraz funkcj
!)!
, ktrej zadaniem jest wypenienie
struktury treci pl cigu
:
<
20
<
20
<
20
"
(#34J
43
(#34%43
(#34F 43
$#
(
4
"
(
#
?1W@#
4
#
349
66
43
KYZZ#
349
66
C 43
.
#
34L
5
43
? g@!#
.
? @#
349 5C 5
43
*-1S-1S-1*.
0(.
0(.
0(#
$
"
255
#
(.
#
*+a
-!1S-!1S-!1*.
2(.
2(.
2(#
$
Liczniki czasu
Programy czsto korzystaj z moliwoci pobrania daty i czasu z nieulotnej pamici
RAM komputera. Norma ANSI przewiduje kilka rnych funkcji, ktre mog zosta
do tego celu wykorzystane. Pierwsz jest funkcja
, zwracajca liczb sekund od
1 stycznia 1970 roku:
(
(
4#
256
Funkcja wypenia przekazan jej jako parametr zmienn typu
) jeli nie jest to
73.., zwracajc t sam warto rwnie jako warto wyjciow. Mona wic wywoywa funkcj
z parametrem 73.. i korzysta z wartoci zwracanej:
<
20
"
(
#
KYZZ#
$
Funkcja
zamienia struktur na 26-znakowy cig (przedstawiony przy
opisie funkcji
):
4
4
#
Funkcja
zamienia warto czasu (zwracan przez
) na 26-znakowy cig:
<
20
<
20
<
20
"
(
#
?A!@#
KYZZ#
.
#
$
Kolejna funkcja,
, zwraca, liczon w sekundach, rnic midzy dwoma
wartociami typu
). Suy wic do wyznaczania iloci czasu, jaki upyn midzy dwoma zdarzeniami, czasu wykonywania funkcji lub generowania przerw w pracy programu, na przykad:
<
20
<
20
X&ZDb
"
(
#
KYZZ#
KYZZH
#
$
"
*+[222I *#
X&ZDbI#
*+L_2*#
$
257
Element struktury )
% przechowuje dzie miesica (od 1 do 31), a )"
% dzie
tygodnia (gdzie niedzieli odpowiada 0). Czas jest mierzony od 1900 roku. Warto
) to znacznik, ktry informuje o tym, czy stosowany jest czas letni. Stosowane nazwy struktury i jej elementw mog rni si w zalenoci od kompilatora,
jednak sama struktura zasadniczo pozostaje niezmieniona.
Funkcja #
zamienia struktur na warto
), uzupeniajc wartoci pl
)"
% i )%
%:
(
4#
258
Funkcja #
zapewnia rwnie wprowadzenie odpowiednich poprawek dla wartoci przekraczajcych swj dopuszczalny zakres. Mona to wykorzysta do ustalenia dokadnej daty, odlegej o dni:
<
20
<
20
<
20
"
4
#
(
5#
5
KYZZ#
.5#
0
(H !#
#
0
(0gg
0
(- !!#
5CB
;6 5
;C; g!!5
; 8gg
92:2
*M6E
6-!13-!13-!1+*
0
(
0
(H
0
(#
$