7 - Biblioteki zewnętrzne

Ikona obiektów Cele lekcji
  • Poznanie mechanizmów funkcjonowania bibliotek i plików zewnętrznych w języku C/C++
  • Poznanie biblioteki do obsługi działań na łańcuchach: string.h

Ikona obiektów Co powinieneś już wiedzieć?
  • Jak korzystać ze wskaźników w C/C++
  • Jak wyglądają i są obsługiwane procedury i funkcje
  • Jak tworzyć tablice w C/C++

Ikona obiektów Pliki zewnętrzne

Do każdego pliku z kodem w języku C/C++ można dołączać dowolne pliki zewnętrzne poprzez użycie dyrektywy prekompilatora include. Jak każda dyrektywa prekompilatora, słówko to poprzedzone jest znakiem # (hasz), natomiast po nim znajduje się ścieżka do pliku, który ma zostać dołączony. Jeśli nie chcemy używać pełnej ścieżki bezwzględnej, możemy użyć ścieżki względnej, wówczas katalog startowy może być różny w zależności od użytych nawiasów. I tak:

#include "cos.h"

sprawi, że plik cos.h będzie się musiał znajdować w tym samym katalogu co plik z kodem, w którym umieszczamy tę linijkę. Natomiast:

#include <cos.h>

sprawi, że plik cos.h będzie musiał znajdować się w katalogu standardowych bibliotek, określonym w kompilatorze.

UWAGA! Dołączenie pliku zewnętrznego w C/C++ oznacza dokładne "wklejenie" jego zawartości w miejsce, w którym wpisane jest polecenie include.


Ikona obiektów Biblioteki

W języku C/C++ bardzo mało poleceń jest wbudowanych w kompilator. W większości trzeba korzystać z procedur i funkcji zaimplementowanych w pewnych bibliotekach zewnętrznych (także polecenia wejścia i wyjścia). Najbardziej znane i najczęściej używane biblioteki standardowe to:

  • math.h - funkcje matematyczne
  • stdio.h - operacje standardowego wejścia/wyjścia
  • stdlib.h - podstawowe (standardowe) funkcje
  • string.h - operacje na łańcuchach
  • time.h - funkcje obsługi czasi
  • iostream.h - operacje na strumieniach
W przypadku dołączania takich bibliotek ze standardowego katalogu, można nie umieszczać rozszerzenia .h (standardowe rozszerzenie plików nagłówkowych).

Ikona obiektów Zmienne znakowe

Zmienne znakowe to zmienne przechowujące wszelkie znaki, np. takie, które można wprowadzić z klawiatury.

Aby wczytać/wypisać zmienną znakową, należy użyć znaczników %c. Należy jednak pamiętać, że zmienna typu char jest w rzeczywistości liczbą całkowitą z zakresu od -128 do 127 (a typu unsigned char - z zakresu od 0 do 255) i jako taka jest traktowana przez język C/C++. Jedynie znacznik %c wskazuje na sposób zapisywania i odczytywania tych zmiennych. Liczby od 0 do 255 odpowiadają kodom ASCII danego znaku.


Litera 'a' ma w kodzie ASCII przypisaną liczbę 97, a po niej następują kolejne litery, w kolejności alfabetycznej. Wiedząc to zastanów się, co wypisze poniższy fragment kodu:

char c;
c='a';
printf("%c %d\n",c,c);
c+=3;
printf("%c %d",c,c);



Ikona obiektu Zastanów się

Jak już powiedzieliśmy, litery są traktowane zupełnie jak liczby w kodzie ASCII. Zastanów się więc, co sprawdza poniższy warunek:

char c;
if ('a' <= c && c <= 'z');

Ikona obiektów Stringi

String to nazwa typu danych służącego do przechowywania napisów (zmiennych łańcuchowych).

W podstawowych wersjach języka C/C++ typ zmiennych string nie jest wprowadzony bezpośrednio. Żeby go używać, trzeba używać po pierwsze odpowiednich bibliotek, a po drugie, nawet wtedy, standardowa obsługa stringów to jedynie obsługa tablic zmiennych typu char. Oznacza to, że każdy napis w C/C++ jest jedynie tablicą, w której zapisany jest ciąg liter. Jest to tablica o tyle szczególna, że znakiem kończącym string (napis) jest znak "\0", czyli zero w kodzie ascii. W związku z tym, aby przechowywać napis o długości n potrzebna jest tablica o długości n+1, aby móc przechować także znak końca napisu.

Przykładowe deklaracje stringów mogą wyglądać następująco:

char *string;

char string[];

char string[123];

Do wypisywania napisów służy znacznik ""%s". Za jego pomocą można również wczytywać napisy, ale tylko takie, które nie mają białych znaków (np. spacji), napotkany biały znak jest bowiem traktowany jako koniec napisu. Np. jeśli dla poniższego kawałka kodu na wejściu wpiszemy "Ala ma kota", to na wyjściu otrzymamy jedynie słówko "Ala":

char string[30];
scanf("%s",s);
printf("%s",s);

Jak można zauważyć, wyjątkowe jest również to, że w przypadku wczytywania napisów przed nazwą zmiennej nie umieszczamy znaku '&' (ampersanda).

Aby wczytać całą linię (wraz ze wszystkimi białymi znakami) można użyć funkcji gets. Fragment kodu, który na wyjściu wypisze dokładnie tę linię, którą otrzymał na wejściu, może wyglądać następująco:

char string[30];
gets(s);
printf("%s",s);


Ikona obiektów Biblioteka

Aby móc korzystać ze stringów w C/C++, potrzebna jest biblioteka <string.h>. W niej zawarte są wszelkie funkcje i procedury, które operują na stringach.

Najważniejsze funkcje to: (ich opis znajduje się pod linkami)

Dodatkowo bardzo ważną funkcją jest funckja atoi() (oraz analogiczne do niej atof() oraz atol()), które znajdują się w bibliotece <stdlib.h>, jak również funkcje sprintf() oraz sscanf() z biblioteki <stdio.h>.

Ikona obiektu Zastanów się
W języku Pascal dostępny jest standardowy typ string, czyli tablica, która zawiera 255 znaków. Jak wyglądałaby deklaracja takiej zmiennej w języku C/C++?