Dodatak C. Standardna biblioteka C jezika Standardna biblioteka C jezika definirana je standardom: American national standard for information systems - Programming language C, ANSI X3.159-1989, American National Standards Institute. 1989. Sadrži niz korisnih funkcija, predefiniranih konstanti (makro naredbi), typedef tipova i globalnih varijabli (pr. stdin, stdout). Deklaracija tih objekata zapisana je u datotekama koje se nazivaju zaglavlja ili h-datoteke (eng. headers), a koriste se kao početne #include datoteke u gotovo svakom izvornom programu. Funkcionalna podjela h-datoteke (zaglavlja) temeljne definicije <stddef.h> rad s ulazno izlaznim uređajima i datotekama <stdio.h> radnje s znakovima i stringovima <string.h>, <ctype.h>, <stdlib.h>, <stdio.h> alociranje memorije <stdlib.h> matematičke funkcije <math.h> datum i vrijeme <time.h> promjenljivi broj argumenata <stdarg.h> globalni skokovi <setjmp.h> asertacija <assert.h> prihvat signala stanja računalnog procesa <signal.h> prihvat i dojava pogreške <errno.h>, <stdio.h>, <string.h> minimalne i maksimalne vrijednosti tipova <limits.h>, <float.h> lokalizacija znakovnih zapisa <locale.h>, <stdlib.h>, <wchar.h>, <wctype.h> sučelje s operativnim sustavom <stdlib.h> Slijedi opis funkcija definiranih standardom. Za svaku funkciju navodi se deklaracija, opis argumenata funkcije i tip vrijednosti koju funkcija vraća. C 1 <stdio.h> U zaglavlju <stdio.h>, definiran je niz funkcija za rad s ulazno/izlaznim tokovima. Svakom toku je pridjeljen pokazivač na strukturu FILE koja je također definirana u <stdio.h>. Standardni ulaz, standardni izlaz i standardni tok dojave greške se automatski inicijaliziraju pri startanju programa, a njihov pokazivač na strukturu FILE je u globalnim varijablama: FILE *stdin; /* pokazivač toka standardnog ulaza */ FILE *stdout; /* pokazivač toka standardnog izlaza */ FILE *stderr; /* pokazivač toka dojave greške */ Iniciranje pokazivača datotečnih tokova vrši se pomoću funkcije fopen(). Kada se završi rad s datotekom treba zatvoriti njen tok pomoću funkcije fclose(). U zaglavlju <stdio.h> definirana je i simbolička konstanta EOF koja služi kao oznaka kraja datoteke. Dodatak C - standardna biblioteka C jezika 1
Otvaranje i zatvaranje toka fopen FILE *fopen(const char *name, const char *mode); fopen otvara tok za datoteku imena name. Ako je operacija uspješna, funkcija vraća pokazivač toka, a ako je neuspješna tada vraća NULL. String mode označava način na koji će biti otvorena datoteka. Prvi znak tog stringa mora biti r, w, ili a, što označava da se datoteka otvara za čitanje, pisanje ili dopunjavanje. Ako se nakon prvog znaka napiše znak + tada se datoteka otvara za čitanje i pisanje. Dodatno sa može napisati i znak b. To je oznaka da se na MS-DOS sustavima datoteka tretira kao binarna datoteka. U suprotnom datoteka se otvara u tekstualnom modu. Tada se kod MS-DOS /Windows sustava znak za kraj retka \n u tekstualnoj datoteci zapisuje s dva znaka \r\n, također se znak Ctrl-Z (ASCII vrijednost 26) tretira kao oznaka kraja datoteke. Ove pretvorbe ne postoje na Unix sustavima. freopen FILE *freopen(const char *name, const char *mode, FILE *fp); freopen služi kao i fopen, ali na način da se datoteka imena name poveže s postojećim pokazivačem toka fp. Tipično se koristi za redirekciju sa standardnih tokova, primjerice, naredbom freopen("output.log", "w", stdout); budući izlaz koji generiraju funkcije koje djeluju na stdin (primjerice putchar i printf ) bit će preusmjeren u datoteku output.log. fclose int fclose(file *fp); Funkcija fclose() zatvara tok fp. U slučaju greške vraća EOF, inače vraća 0. Funkcija fclose() se automatski primjenjuje na sve otvorene tokove pri normalnom završetku programa. fflush int fflush(file *fp); Ako je otvoren tok fp, funkcijom fflush() svi se podaci iz privremenog datotečnog spremnika zapišu u datoteku. Funkcija vraća 0, ili EOF ako nastupi greška. Input and Output Operations getchar, getc, fgetc int getchar(); int getc(file *fp); int fgetc(file *fp); Funkcija getc() vraća sljedeći dobavljivi znak iz toka fp, ili EOF ako je kraj datoteke. Obično EOF ima vrijednost -1, kako bi se razlikovao od ostalih znakova. Zbog toga ova funkcija vraća tip int, a ne tip char. Funkcija getchar() je ekvivalentna getc(stdin). Funkcija fgetc()je ekvivalentna getc(), ali može biti implementirana kao makro naredba. putchar, putc, fputc Dodatak C - standardna biblioteka C jezika 2
int putchar(int c); int putc(int c, FILE *fp); int fputc(int c, FILE *fp); Funkcija putc() upisuje znak c u tok fp. Funkcija putchar(c) je ekvivalentna putc(c, stdout). Funkcija fputc je ekvivalentna putc(),ali može biti implementirana kao makro naredba. Sve tri funkcije vraćaju upisani znak, ili EOF u slučaju greške. printf, fprintf int printf(const char *format,...); int fprintf(file *fp, const char *format,...); Funkcija fprintf() upisuje tekstualno formatirane argumente u tok fp. Tri točkice označavaju listu argumanata. Format se određuje u stringu format, koji sadrži znakove koji se direktno upisuju na izlazni tok i specifikatore formatiranog ispisa argumenata. printf(format, ) je ekvivalentno fprintf(stdout, format, ). Specifikator formata se sastoji od znaka %, iza kojeg slijede oznake za širinu i preciznost ispisa te tip argumenta, u sljedećem obliku: %[prefiks][širina_ispisa][. preciznost][veličina_tipa]tip_argumenta Specifikator formata mora započeti znakom % i završiti s oznakom tipa argumenta. Sva ostala polja su opciona (zbog toga su napisana unutar uglatih zagrada). U polje širina_ispisa zadaje se minimalni broj kolona predviđenih za ispis vrijednosti. Ako ispis sadrži manji broj znakova od zadane širine ispisa, na prazna mjesta se ispisuje razmak. Ako ispis sadrži veći broj znakova od zadane širine, ispis se proširuje. Ako se u ovo polje upiše znak * to znači da će se broj kolona indirektno očitati iz slijedećeg argumenta funkcije, koji mora biti tipa int. Polje prefiks može sadržavati jedan znak koji ima sljedeće značenje: - Ispis se poravnava prema lijevoj granici ispisa određenog poljem širina_ispisa. (inače se poravnava s desne strane) U prazna mjesta se upisuje razmak + Pozitivnim se vrijednostima ispisuje i + predznak. razmak Ako je vrijednost positivna, dodaje se razmak prije ispisa (tako se može poravnati kolone s pozitivnim i negativnim brojevima). 0 Mjesta razmaka ispunjuju se znakom 0. # Alternativni stil formatiranja Polje. preciznost određuje broj decimalnih znamenki iza decimalne točke kod ispisa realnog broja ili minimalni broj znamenki ispisa cijelog broja ili maksimalni broj znakova koji se ispisuje iz nekog stringa. Ovo polje mora započeti znakom točke, a iza nje se navodi broj ili znak *, koji znači da će se preciznost očitati iz slijedećeg argumenta tipa int. Ukoliko se ovo polje ne koristi, tada se podrazumijeva da će realni brojevi biti ispisani s maksimalno šest decimalnih znamenki iza decimalne točke. Polje tip_argumenta može sadržavati samo jedan od sljedećih znakova znakova: c Argument se tretira kao int koji se ispisuje kao znak iz ASCII skupa. d, i Argument se tretira kao int, a ispisuje se decimalnim znamenkama. e, E Argument je float ili double, a ispis je u eksponentnom formatu. f Argument je float ili double, a ispis je prostom decimalnom formatu. Ako je prefiks # i preciznost.0, tada se ne ispisuje decimalna točka. g, G Argument je float ili double, a ispis je prostom decimalnom formatu ili u eksponencijalnom formatu, ovisno o tome koji daje precizniji ispis u istoj širini ispisa. o Argument je unsigned int, a ispisuje se oktalnim znamenkama. p Argument se tretira kao pokazivač tipa void *, pa se na ovaj način može ispisati adresa bilo Dodatak C - standardna biblioteka C jezika 3
koje varijable. Adresa se obično ispisuje kao heksadecimalni broj. s Argument mora biti literalni string odnosno pokazivač tipa char *. u Argument je unsigned int, a ispisuje se decimalnim znamenkama. x, X Argument je unsigned int, a ispisuje se heksadecimalnim znamenkama. Ako se zada prefiks #, ispred heksadecimalnih znamenki se ispisuje 0x ili 0X. % Ne odnosi se na argument, već znači ispis znaka % n Ništa se ne ispisuje, a odgovarajući argument mora biti pokazivač na int, u kojega se upisuje broj do tada ispisanih znakova Polje veličina_tipa može sadržavati samo jedan znak koji se upisuje neposredno ispred oznake tipa. h l L Pripadni argument tipa int tretira se kao short int ili unsigned short int. Pripadni argument je long int ili unsigned long int. Pripadni argument realnog tipa je long double. Funkcije printf() and fprintf() vraćaju broj ispisanih znakova. Ako nastupi greška, vraćaju negativan broj. scanf, fscanf int scanf(const char *format,...); int fscanf(file *fp, const char *format,...); Funkcijom fscanf() dobavljaju se vrijednosti iz tekstualnog toka fp po pravilima pretvorbe koji su određeni u stringu format. Te vrijednosti se zapisuju na memorijske lokacije određene listom pokazivačkih argumenata. Lista argumenata (...) je niz izraza odvojenih zarezom, čija vrijednost predstavlja adresu postojećeg memorijskog objekta. Tip objekta mora odgovarati specifikaciji tipa prethodno zapisanog u stringu format. scanf(format, ) je ekvivalentno fscanf(stdin, format, ). String format se formira od proizvoljnjih znakova i specifikatora formata oblika: %[prefiks][širina_ispisa][veličina_tipa]tip_argumenta Ako se pored specifikatora formata navedu i proizvoljni znakovi tada se očekuje da oni budu prisutni u ulaznom tekstu (osim tzv. bijelih znakova: razmak, tab i nova linija). Osim u slučaju specifikatora %c, %n, %[, i %%, za sve pretvorbe sa podrazumijeva da se iz ulaznog teksta odstrane bijeli znakovi. Jedini opcioni prefiks je znak * koji znači da se pretvorena vrijednost ne dodjeljuje ni jednom argumentu. U polju širina_ispisa zadaje se maksimalni broj kolona predviđenih za dobavu vrijednosti. Polje veličina_tipa može sadržavati samo jedan znak koji se upisuje neposredno ispred oznake tipa pokazivačkog argumenta. To su sljedeći znakovi: h l L Pripadni argument tipa int tretira se kao short int ili unsigned short int. Pripadni argument je long int ili unsigned long int. Pripadni argument realnog tipa je long double. Polje tip_argumenta može sadržavati samo jedan od sljedećih znakova: c d Dobavlja se jedan znak, a argument je tipa char *. Ako je definirano polje širina_unosa, tada se unosi onoliko znakova kolika je vrijednost širina_unosa. Dobavlja se cijeli broj, a argument je tipa int * ( ili short int * ili long int *, ako je Dodatak C - standardna biblioteka C jezika 4
zadana veličina tipa h ili l). i Dobavlja se cijeli broj, a argument je tipa int * ( ili short int * ili long int *, ako je zadana veličina tipa h ili l). Pretvorba se vrši i ako je broj zapisan oktalno (započima znamenkom 0) ili heksadecimalno (započima s 0x ili 0X), e, E, f, Dobavlja se realni broj. Argument je tipa float * ili double *. g, G o Dobavlja se cijeli broj zapisan oktalnim znamenkama. Argument je tipa unsigned int* (ili unsigned short int * ili unsigned long int *, ako je zadana veličina tipa h ili l). p Dobavlja se pokazivač, a argument mora biti tipa void **. s Dobavlja se string koji ne sadrži bijele znakove. Argument mora biti tipa char *. u Dobavlja se cijeli broj, a argument je tipa unsigned int * ( ili unsigned short int * ili unsigned long int *, ako je zadana veličina tipa h ili l). x, X Dobavlja se cijeli broj zapisan heksadecimalno. Argument je tipa unsigned int* Argument je tipa unsigned int* (ili unsigned short int * ili unsigned long int *, ako je zadana veličina tipa h ili l). % Ne odnosi se na argument, već znači dobavu znaka % n Ne vrši se pretvorba. Odgovarajući argument mora biti tipa int *. Upisuje se broj do tada učitanih znakova [ Za format oblika %[...] dobavlja se string koji sadrži znakove koji su unutar zagrada, prema sljedećem obrascu: %[abc] znači da se dobavlja string koji može sadržavati znakove a,b ili c. %[a-d] znači da se dobavlja string koji može sadržavati znakove a,b,c ili d. %[^abc] znači da se dobavlja string koji može sadržavati sve znakove osim a,b ili c. %[^a-d] znači da se dobavlja string koji može sadržavati znakove sve znakove osim a,b,c ili d. Argument je tipa char *. Funkcije scanf() and fscanf() vraćaju broj uspješno izvršenih pretvorbi (bez %n i %*). Ako se ne izvrši ni jedna konverzija, zbog dosegnutog kraja datoteke, vraća se vrijednost EOF. gets, fgets char *fgets(char *buf, int n, FILE *fp); char *gets(char *buf); Funkcije fgets() čita liniju teksta (koja završava znakom \n ) iz toka fp, i sprema taj tekst (uključujući \n i zaključni znak \0 ) u znakovni niz buf. Veličina tog niza je n znakova. Ako u liniji ima više od n-2 znakova, tada neće biti dobavljeni svi znakovi. Funkcije gets() je ekvivalentna funkciji fgets(), ali isključivo služi za dobavu stringa s tipkovnice. Ona ne prenosi znak nove linije i ne vrši kontrolu broja unesenih znakova. Obje funkcije vraćaju pokazivač na dobavljeni string ili NULL ako je greška ili kraj datoteke. puts, fputs int puts(char *str); int fputs(char *str, FILE *fp); Funkcija fputs() ispisuje string str u tok fp. Funkcija puts()ispisuje string str na stdout i dodaje znak nove linije. Obje funkcije vraćaju pozitivnu vrijednost ili EOF ako nastane greška. fread size_t fread(void *buf, size_t elsize, size_t n, FILE *fp); Dodatak C - standardna biblioteka C jezika 5
Funkcija fread()iz toka fp čita blok veličine n x elsize bajta i upisuje u spremnik buf. Za dobavu n elemenata nekog tipa, elsize treba biti jednak sizeof(tip elementa). Kod čitanja znakova je elsize = 1. Funkcija vraća broj dobavljenih elemenata ili EOF u slučaju greške. fwrite size_t fwrite(void *buf, size_t elsize, size_t n, FILE *fp); Funkcija fwrite() upisuje u tok fp blok veličine n x elsize bajta iz spremnika buf. Za upis n elemenata nekog tipa, elsize treba biti jednak sizeof(tip elementa). Kod upisa n znakova elsize = 1. Funkcija vraća broj upisanih elemenata ili EOF u slučaju greške. ungetc int ungetc(int c, FILE *fp); Funkcija ungetc()umeće u tok fp znak c, tako da će pri sljedećem čitanju taj znak biti prvi očitan. Ova operacija se može obaviti samo nakon operacije čitanja iz toka. Funkcija vraća znak c ili EOF u slučaju greške. Pozicioniranje toka Mjesto na kojem se vrši čitanje/pisanje u tok naziva se trenutna pozicija toka (eng. stream position). U radu s binarnim datotekama može se kontrolirati i postavljati trenutnu poziciju toka. ftell long int ftell(file *fp); Funkcija ftell vraća long int vrijednost koja je jednaka trenutnoj poziciji toka fp. (kod binarnih datoteka to je pomak u bajtima od početka datoteke). Ako se radi s velikom datotekama, u kojima pozicija može biti veće od long int, tada treba koristiti funkciju fgetpos(). fseek, rewind int fseek(file *fp, long int pos, int from); void rewind(file *fp); Funkcija fseek() postavlja trenutnu poziciju toka fp na poziciju pos, relativno prema vrijednosti from argumenta, koji može imati tri vrijednosti: SEEK_SET (početak datoteke), SEEK_CUR (trenutna pozicija) i SEEK_END (kraj datoteke). Argument pos može biti negativna vrijednost. Funkcija vraća 0, ako je operacija uspješna. Ako je argument from jednak SEEK_SET, nova_pozicija = pos; Ako je argument from jednak SEEK_CUR, nova_pozicija = trenutna_pozicija + pos; Ako je argument from jednak SEEK_END nova_pozicija = pozicija_kraja_datoteke + pos; Nova pozicija mora biti veća ili jednaka nuli, i može biti veća od trenutne pozicije. Dodatak C - standardna biblioteka C jezika 6
Funkcija rewind(fp) postavlja poziciju na 0, što je ekvivalentno fseek(fp, 0, SEEK_SET). Ovu funkciju se može koristiti i s tekstualnim datotekama. fgetpos, fsetpos int fgetpos(file *fp, fpos_t *pos); int fsetpos(file *fp, const fpos_t *pos); Funkcija fgetpos()zapisuje trenutnu poziciju toka fp u fpos_t objekt na kojega pokazuje pos. Funkcija fsetpos postavlja trenutnu poziciju toka fp na vrijednost fpos_t objekta na kojeg pokazuje pos (to mora biti vrijednost prethodno dobijena funkcijom fgetpos). Obje funkcije vraćaju 0 ako je operacija uspješna. Kontrola ulazno/izlaznog spremnika setbuf, setvbuf void setbuf(file *fp, char *buf); void setvbuf(file *fp, char *buf, int mode, size_t size); Pomoću ovih funkcija postavlja se korisnički definirani spremnik buf kao spremnik ulazno/izlaznih operacija. Primjenjuju se prije poziva ulazno/izlaznih operacija na otvoreni tok fp. Kod funkcije setbuf() veličina spremnika mora biti jednaka BUFSIZE (definiran u stdio.h). Ako je buf==null tada se ne koristi spremnik. Kod funkcije setvbuf() veličina spremnika se postavlja argumentom size, a način korištenja spremnika se postavlja argumentom mode, koji može imati tri predefinirane vrijednosti: _IONBF Ne koristi se spremnik, već se vrši neposredan pristup datoteci. _IOFBF Spremnik se koristi potpuno, tj. spremnik se prazni tek kada je popunjen. _IOLBF Spremnik se koristi djelomično (uvijek se prazni kada se ispisuje znak nove linije \n ). Dojava i prihvat greške feof int feof(file *fp); Funkcija feof() vraća nenultu vrijednost ako je tok u poziciji kraj_datoteke, inače vraća 0. ferror int ferror(file *fp); Funkcija ferror() vraća nenultu vrijednost ako je nastala greška u radu s tokom, inače vraća 0. clearerr void clearerr(file *fp); Funkcija clearerr() briše indikatore greške ili kraj_datoteke za tok fp. perror Dodatak C - standardna biblioteka C jezika 7
void perror(const char *prefix); Funkcija perror() ispisuje poruku na stderr o trenutno nastaloj greški. Tip greške se bilježi u globalnoj varijabli errno. Poruka je ista kao i poruka koja se dobije pozivom funkcije strerror(errno). Drugim riječima, perror(p) je otprilike ekvivalentna pozivu fprintf(stderr, "%s: %s", p == NULL? "" : p, strerror(errno)); Argument prefix je proizvoljni string koji se ispisuje ispred poruke. Operacije s formatiranim stringovima sprintf, sscanf int sprintf(char *buf, const char *format,...); int sscanf(const char *buf, const char *format,...); Funkcije sprintf() i sscanf() su varijante od printf() i scanf() koje umjesto ulazno/izlaznog toka koriste proizvoljno odabrani string buf. Znak kraja stringa \0 se tretira kao znak kraj_datoteke. Korisnik mora voditi računa o tome da veličina stringa buf bude dovoljno velika, da se može izvršiti sve pretvorbe formata u sprintf() funkciji. Operacije s promjenjljivom listom argumenata vprintf, vfprintf, vsprintf int vprintf(const char *format, va_list argp) int vfprintf(file *fp, const char *format, va_list argp) int vsprintf(char *buf, const char *format, va_list argp) Ove funkcije omogućuju definiranje funkcija s promjenljivim brojem argumenata, koje imaju funkcionalnost kao printf(), fprintf(), i sprintf() funkcije. Posljednji argument ovih funkcija argp je pokazivač tipa va_list. To omogućuje rad s promjenljivim brojem argumenata. U sljedećem programu definirana je funkcija za dojavu greške, koju se može koristiti za dojavu greške pri analizi izvornog programa. Ona koristi dvije globalne varijable koje sadrže ime datoteke (filename) i broj linije izvornog programa (lineno). U dojavi greške se uvijek prije izvještaja o tipu greške ispisuje to ime i broj linije. #include <stdio.h> #include <stdarg.h> extern char *filename; /* current input file name */ extern int lineno; /* current input line number */ void error(char *msg,...) { va_list argp; va_start(argp, msg); fprintf(stderr, "%s:, line %d: ",filename, lineno); vfprintf(stderr, msg, argp); fprintf(stderr, "\n"); va_end(argp); } Dodatak C - standardna biblioteka C jezika 8
Manipuliranje s datotekama rename int rename(const char *origname, const char *newname); Funkcija rename() vrši promjenu imena datoteke origname, u ime newname. Ako je operacija uspješna funkcija vraća 0, inaće vraća nenultu vrijednost. remove int remove(const char *name); Funkcija remove() briše datoteku imena name. Ako je operacija uspješna funkcija vraća 0, inaće vraća nenultu vrijednost. tmpfile, tmpnam FILE *tmpfile(void); char *tmpnam(char *buf); Funkcija tmpfile() stvara privremenu datoteku i otvara je u "wb+" modu. Po izlasku iz programa ova se datoteka automatski briše. Funkcija tmpnam() generira jedinstveno ime u string buf, koji mora biti duljine L_tmpnam (predefinirana konstanta). To se ime može koristiti za stvaranje datoteke. Ako je buf==0, ime se generira u internom statičkom spremniku. Funkcija vraća pokazivač na taj spremnik. C 2 <string.h> Funkcije koje su deklarirane u <string.h> uglavnom služe za rad s ASCIIZ stringovima. Pored njih, definirano je nekoliko funkcija, čije ime započima s mem, za rad s memorijskim blokovima (nizovima). Rad sa stringovima size_t strlen(const char *s) Vraća duljinu stringa s. char *strcpy(char *s, const char *t) Kopira string t u string s, uključujući '\0'; vraća s. char *strncpy(char *s, const char *t, size_t n) Kopira najviše n znakova stringa t u s; vraća s. Dopunja string s sa '\0' znakovima ako t ima manje od n znakova. Napomena: ako u stringu t ima n ili više znakova, tada string s neće biti zaključen s '\0'. char *strcat(char *s, const char *t) Dodaje string t na kraj stringa s; vraća s. char *strncat(char *s, const char *t, size_t n) Dodaje najviše n znakova stringa t na string s, i znak '\0'; vraća s. int strcmp(const char *s, const char *t) Uspoređuje string s sa stringom t, vraća <0 ako je s<t, 0 ako je s==t, ili >0 ako je s>t. Usporedba je leksikografska, prema ASCII rasporedu. Dodatak C - standardna biblioteka C jezika 9
int strncmp(const char *s, const char *t, size_t n) Uspoređuje najviše n znakova stringa s sa stringom t; vraća <0 ako je s<t, 0 ako je s==t, ili >0 ako je s>t. int strcoll(const char *s, const char *t); strcoll() uspoređuje dva stringa s1 and s2, poput strcmp(), ali se usporedba vrši prema multinacionalnom znakovnom rasporedu (koji je određen konstantom LC_COLLATE ). Vraća <0 ako je s<t, 0 ako je s==t, ili >0 ako je s>t. size_t strxfrm(char *s, const char *t, size_t n); strxfrm() formira modificiranu kopiju n znakova stringa t u stringu s (uključujući \0 ), tako da strcmp(s,t) daje istu ocjenu kao i strcoll(s,n) na originalnom stringu. Vraća broj znakova u stringu s. char *strchr(const char *s, int c) Vraća pokazivač na prvu pojavnost znaka c u stringu s, ili NULL znak ako c nije sadržan u stringu s. char *strrchr(const char *s, int c) Vraća pokazivač na zadnju pojavnost znaka c u stringu s, ili NULL znak ako c nije sadržan u stringu s. char *strstr(const char *s, const char *t) Vraća pokazivač na prvu pojavu stringa t u stringu s, ili NULL ako string s ne sadrži string t. size_t strspn(const char *s, const char *t) Vraća duljinu prefiksa stringa s koji sadrži znakove koji čine string t. size_t strcspn(const char *s, const char *t) Vraća duljinu prefiksa stringa s koji sadrži znakove koji nisu prisutni u stringu t. char *strpbrk(const char *s, const char *t) Vraća pokazivač na prvu pojavu bilo kojeg znaka iz string t u stringu s, ili NULL ako nije prisutan ni jedan znak iz string t u stringu s. char *strerror(int n) Vraća pokazivač na string koji se interno generira, a služi za dojavu greške u nekim sistemskim operacijama. Argument je obično globalna varijabla errno, čiju vrijednost određuje izvršenje funkcija iz standardne biblioteke. char *strtok(char *s, const char *sep) strtok() je funkcija kojom se može izvršiti razlaganje stringa na niz leksema koji su razdvojeni znakovima-separatorima. Skup znakova-separatora se zadaje u stringu sep. Funkcija vraća pokazivač na leksem ili NULL ako nema leksema. Korištenje funkcije strtok() je specifično jer u stringu može biti više leksema, a ona vraća pokazivač na jedan leksem. Da bi se dobili slijedeći leksemi treba iznova pozvati ovu funkciju, ali s prvim argumentom jednakim NULL. Primjerice, za string char * s = "Prvi drugi,treci"; ako odaberemo znakove separatore: razmak, tab i zarez, tada sljedeći iskazi daju ispis tri leksema (Prvi drugi i treci): char *leksem = strtoken(s, ",\t"); /* dobavi prvi leksem */ Dodatak C - standardna biblioteka C jezika 10
while( leksem!= NULL) { /* ukoliko postoji */ printf("", leksem); /* ispiši ga i */ lexem = strtok(null,",\t"); /* dobavi sljedeći leksem */ } /* pa ponovi postupak */ Operacije s memorijskim blokovima (nizovima) memcpy, memmove void *memcpy(void *dest, const void *src, size_t n); void *memmove(void *dest, const void *src, size_t n); Ove funkcije kopiraju točno n bajta s lokacije na koju pokazuje src na lokaciju koju pokazuje dest. Ukoliko se blokovi preklapaju tada treba koristiti funkciju memmove(). Funkcije vraćaju pokazivač dest. memcmp int memcmp(const void *p1, const void *p2, size_t n); Funkcija memcmp() uspoređuje točno n znakova s lokacija na koje pokazuju p1 i p2, na isti način kao strcnmp(), ali se usporedba ne prekida ako je dostignut znak \0. memchr void *memchr(const void *p, int c, size_t n); Funkcija memchr() traži prvu pojavu znaka c u n znakova bloka na koji pokazuje p. Vraća pokazivač na pronađeni znak ili NULL ako znak nije pronađen. memset void *memset(void *p, int c, size_t n); Funkcija memset() spostavlja n bajta bloka na koji pokazuje p na vrijednost znaka c, i vraća p. C 3 <ctype.h> Funkcije iz <ctype.h> omogućuju klasifikaciju znakova i pretvorbu velikih u mala slova i obratno. Klasifikacija znakova int isupper(int c); vraća vrijednost različitu od nule ako je znak c veliko slovo, inače vraća 0. int islower(int c); int isalpha(int c); int iscntrl(int c); vraća vrijednost različitu od nule ako je znak c malo slovo, inače vraća 0. vraća vrijednost različitu od nule ako je znak c veliko ili malo slovo, inače vraća 0. vraća vrijednost različitu od nule ako je znak c kontrolni znak, inače vraća 0. Dodatak C - standardna biblioteka C jezika 11
int isalnum(int c); vraća vrijednost različitu od nule ako je znak c slovo ili znamenka, inače vraća 0. int isdigit(int c); int isxdigit(int c); int isgraph(int c); int isprint(int c); int ispunct(int c); int isspace(int c); vraća vrijednost različitu od nule ako je znak c decimalna znamenka, inače vraća 0. vraća vrijednost različitu od nule ako je znak c heksadecimalna znamanka, inače vraća 0. vraća vrijednost različitu od nule ako je znak c tiskani znak osim razmaka, inače vraća 0. vraća vrijednost različitu od nule ako je znak c tiskani znak uključujući razmak, inače vraća 0. vraća vrijednost različitu od nule ako je znak c tiskani znak osim razmaka, slova ili znamanke, inače vraća 0. vraća vrijednost različitu od nule ako je znak c razmak, tab, vert. tab, nova linija, povrat ili nova stranica, inače vraća 0. Pretvorba znaka int toupper(int c); int tolower(int c); Funkcija toupper() pretvara malo slovo u ekvivalentno veliko slovo, ostala slova ostaju nepromijenjena. Slično, tolower() pretvara veliko slovo u ekvivalentno malo slovo. C 4 <stdlib.h> U zaglavlju <stdlib.h> definirano je nekoliko temeljnih funkcija za alokaciju memorije, pretvorbu stringa u brojeve, manipuliranje s multibajtnim znakovnim skupom, itd. Alokacija memorije malloc, calloc void *malloc(size_t n); void *calloc(size_t n, size_t elsize); Funkcijom malloc alocira se n bajta slobodne memorije. Ako je alociranje uspješno funkcija vraća pokazivač na tu memoriju, u suprotnom vraća NULL pokazivač. Primjerice, naredbom double *dp = malloc(10 * sizeof(double)); dobije se pokazivač dp, koji pokazuje na niz od 10 elemenata tipa double. Funkcija calloc(n, elsize) je ekvivalentna malloc(n * elsize), uz dodatni uvjet da calloc inicijalizira sve bitove alocirane memorije na vrijednost nula. Dodatak C - standardna biblioteka C jezika 12
free void free(void *p); Funkcija free() prima kao argument pokazivač p. Uz pretpostavku da p pokazuje na memoriju koja je prethodno alocirana fukcijom malloc, calloc ili realloc, ova funkcija dealocira tu memoriju. realloc void *realloc(void *oldptr, size_t newsize); Funkcija realloc() vrši promjenu veličine prethodno alocirane memorije, koja je pridjeljena pokazivaču ptr, na veličinu newsize. Funkcija realloc() vraća pokazivač na tu memoriju. Vrijednost toga pokazivača može biti ista kao i vrijednost od ptr, ako memorijski alokator može prilagoditi veličinu zahtjevanog području slobodne memorije veličini newsize. Ukoliko se to ne može ostvariti funkcija realloc alocira novo područje memorije pa u njega kopira i zatim oslobađa dio memorije na koju pokazuje ptr. Ukoliko se ne može izvršiti alokacija memorije funkcija realloc() vraća NULL. Napomena: poziv realloc(p, 0) je ekvivalentan pozivu free(p), a poziv realloc(0, n) je ekivalentan pozivu malloc(n). Pretvorba stringa u numeričku vrijednost atoi, atol, strtol, strtoul int atoi(const char *s); long int atol(const char *s); long int strtol(const char *s, char **endp, int baza); unsigned long int strtoul(const char *s, char **endp, int baza); Ove funkcije pretvaraju numerički string s u odgovarajuću numeričku vrijednost. Funkcija strtol()u stringu s preskače bijele znakove, pretvara s u broj i vraća vrijednost tipa long int. Ona omogućuje pretvorbu iz sustava različite baze. Ako je baza 10 tada se iz ulaznog stringa s prihvaćaju znakovi od 0 do 10, a ako je baza 16 prihvaćaju se i znakovi a-f, A-F. Ako je baza manja od 10 prihvacaju se znakovi od 0 do baza-1. Ako je baza 0, tada se koristi pravilo da oktalni brojevi započimaju s nulom, a heksadecimalni s 0x ili 0X. atoi(s) je ekvivalntno strtol(s,null,0); Argument endp ja pokazivač na pokazivač na char. Njega se koristi za tako da ako endp!= NULL, tada strtol() sprema u *endp pokazivač na prvi znak koji nije obrađen. Ako je to znak '\0', pretvorba je uspješna. Ako je jednak s, pretvorba uopće nije izvršena. Funkcija vraća vrijednost koja je pretvoreni broj ili 0 ako pretvorba nije izvršena ili konstanta LONG_MAX ili LONG_MIN ako se broj ne može predstasviti kao long int. U slučaju prekoračenja postavlja se errno = ERANGE. Funkcija strtoul() je slična strtol() eosim što vraća tip unsigned long int, ili vrijednost ULONG_MAX kod prekoračenja. atol(s) je ekvivalntno strtoul(s,null,0); atof, strtod double atof(const char *s); Dodatak C - standardna biblioteka C jezika 13
double strtod(const char *s, char **endp); Ove funkcije pretvaraju numerički string s u odgovarajuću numeričku vrijednost realnog broja. Funkcija strtod()u stringu s preskače bijele znakove, pretvara s u broj i vraća vrijednost tipa double. Prihvaća prosti i eksponentni zapis realnoh broja. Argument endp ja pokazivač na pokazivač na char. Njega se koristi za tako da ako endp!= NULL, tada strtod() sprema u *endp pokazivač na prvi znak koji nije obrađen. Ako je to znak '\0', pretvorba je uspješna. U slučaju prekoračenja vraća konstantu HUGE_VAL, i postavlja globalnu varijablul errno = ERANGE. atof(s) je ekvivalentno strtod(s, NULL), osim što rezultat nije definiran u slučaju prekoračenja. Generator slučajnih brojeva rand int rand(void); Funkcija rand() vraća slučajni cijeli broj iz intervala 0 do RAND_MAX ( RAND_MAX je konstanta definirana u <stdlib.h>). srand void srand(unsigned int seed); Funkcija srand() postavlja početnu vrijednost seed generatora slučajnih brojeva. Sortiranje i traženje qsort void qsort(void *a, size_t n, size_t elsize, int (*cmpfunc)()); Funkcija qsort() sortira niz a, koji ima n elemenata veličine elsize (u bajtima), prema kriteriju koji je određen funkcijom na koju pokazuje cmpfunc. Ta funkcija mora biti deklarirana u obliku: int name(const void *p1, const void *p2); i mora vratiti cijeli broj koji je manji, veći ili jedanak nuli, ovosno o tome da li je objekt na kojeg pokazuje p1 manji, veći, ili jednak objektu na kojeg pokazuje p2. bsearch bsearch(const void *pobj, const void *a, size_t n, size_t elsize, int (*cmpfunc)()); Funkcija bsearch() vrši binarno traženje u sortitanom nizu a, koji ima n elemenata veličine elsize (u bajtima), tražeći element koji je jednak objektu na kojeg pokazuje pobj. Pri traženju se za usporedbu koristi funkcija na kojiu pokazuje cmpfunc. Deklaracija te funkcije je ista kao kod qsort(). Interakcija s operativnim sustavom getenv Dodatak C - standardna biblioteka C jezika 14
char *getenv(const char *name); Environment sadrži postavke operativnog sustava u sistemskim varijablama (pr. path). Funkcija getenv() traži environment varijablu imena name i vraća njenu vrijednost u obliku stringa. Ako ne može pronaći tu varijablu, tada vraća NULL. atexit int atexit(void (*func)(void)); Funkcija atexit() prima kao argument pokazivač na funkciju func, koja će biti pozvana pri normalnim završetku programa. Vraća 0 ako je funkcija uspješno registrirana. Može se registrirati do 32 funkcije, koje će biti pozvane u obrnutom redoslijedu od reda registriranja. exit void exit(int status); Funkcija exit() vrši normalni završetak programa, poziva sve funkcije koje su registrirane atexit() funkcijom i zatvara sve tokove. Argument status se prosljeđuje operativnom sustavu. Mogu se koristiti i dvije simboličke konstante EXIT_SUCCESS i EXIT_FAILURE. Po dogovoru, status=0 (EXIT_SUCCESS) znači uspješan završetak programa. system int system(const char *s); Funkcija system() prima kao argument string koji sadrži komandu operativnog sustava. Funkcija vraća vrijednost koju vrati operativni sustav po završetku procesa. abort void abort(void); Funkcija abort() predstavlja zahtjev za neposrednim prekidom programa, na isti način kao da je izvršen poziv raise(sigabrt). Cjelobrojne aritmetičke funkcije abs, labs int abs(int x); long int abs(long int x); Obje funkcije vraćaju apsolutnu vrijednost argumenta x.. div, ldiv div_t div(int num, int denom); ldiv_t div(long int num, long int denom); Ove funkcije vrše dijeljenje num/denum na nači da se istovremeno dobije rezultat dijeljenja i ostatak cjelobrojnog dijeljenja. Rezultat se vraća u vrijednost koja je tipa sljedeće strukture: typedef struct { int quot; /* rezultat dijeljenja */ int rem; /* ostatak dijeljenja */ }div_t; Dodatak C - standardna biblioteka C jezika 15
Multibajt znakovne sekvence i stringovi Za zapis znakova po ASCII standardu koristi se tip char. Za zapis znakova se također može koristiti prošireni znakovni tip wchar_t, koji podržava 16-bitni Unicode standard, i multibajt znakovne sekvence MBCS (za jezike poput japanskog). mblen int mblen(const char *s, size_t n); Funkcija mblen() vraća broj znakova u stringu koji sadrži multibajt znakovne sekvence. Analizira se maksimalno n znakova. mbtowc, wctomb int mbtowc(wchar_t dest, const char *src, size_t n); int wctomb(char *dest, wchar_t src); Ove funkcije pretvaraju multibajt znakovnu sekvencu u tip wchar_t i obrnuto. Funkcija mbtowc() analizira maksimalno n bajta iz stringa src i pretvara ih u wchar_t i sprema u dest, te vraća broj bajta ili -1 ako pretvorba nije uspješna. Funkcija wctomb() pretvara prošireni znak src u multibajt sekvencu dest, i vraća broj bajta u toj sekvenci.. (Ovaj broj neće nikada biti veći od konstante MB_CUR_MAX, definirane u <stdlib.h>.) mbstowcs, wcstombs size_t mbstowcs(wchar_t *dest, const char *src, size_t n); size_t wcstombs(char *dest, wchar_t src); Ove funkcije vrše pretvorbu višestruke multibajt sequence i niza proširenih znakova znakova. Funkcija mbtowcs() pretvara multibajt sekvencu src i u niz proširenih znakova i sprema u dest, ali maksimalno n znakova. Vraća broj pretvorenih znakova. Funkcija wcstombs() vrši obrnutu radnju. C 5 <math.h> Standardne matematičke funkcije su deklarirane u zaglavlju <math.h>. Njihov opis je dan sljedećoj tablici: Funkcija double sin(double x); double cos(double x); double tan(double x); Vraća vrijednost: sin(x), sinus kuta x u radijanima cos(x), kosinus kuta x u radijanima tg(x), tangens kuta x u radijanima double asin(double x); arcsin(x), vraća vrijednost [-π/2, π/2], za x [-1,1]. double acos(double x); arccos(x), vraća vrijednost [0, π], za x [-1,1]. double atan(double x); double atan2(double y, double x); double sinh(double x); double cosh(double x); double tanh(double x); arctg(x), vraća vrijednost [-π/2, π/2]. arctan(y / x), vraća vrijednost [-π,π]. sh(x), sinus hiperbolni kuta x ch(x), kosinus hiperbolni kuta x th(x), tangens hiperbolni kuta x double exp(double x); e x, x potencija broja e = 2,781 Dodatak C - standardna biblioteka C jezika 16
double log(double x); double log10(double x); double pow(double x, double y); double sqrt(double x); double ceil(double x); double floor(double x); double fabs(double x); double ldexp(double x,int n); double frexp(double x, int *exp); double modf(double x, double *ip); double fmod(double x, double y); prirodni logaritam ln(x), x>0. logaritam baze 10, log 10 (x), x>0. x y, potenciranje x s eksponentom y. Nastaje greška ako je x=0 i y <= 0, ili ako je x<0, a y nije cijeli broj. x, za x>=0, dugi korijen pozitivnog broja najmanji cijeli broj (tipa double) koji nije manji od x najveći cijeli broj (tipa double) koji nije veći od x x, apsolutna vrijednost od x x*2 n rastavlja x na frakcioni dio i eksponent broja 2. Vraća normaliziranu frakciju od x (iz intervala [1/2,1)] i exponent od 2 u *exp. Ako je x jednak nuli, oba dijela su jednaka nuli. Primjerice, frexp(2.5, &i) vraća 0.625 (odnosno 0.101 baze 2) i postavlja i na 2, tako da ldexp(0.625, 2) ponovo daje vrijednost 2.5. rastavlja x na integralni i frakcioni dio, tako da oba imaju predznak od x. Vraća frakcioni dio, a integralni dio smješta u *ip. ostatak dijeljenja realnih brojeva x/y, s predznakom od x. C 6 <time.h> U zaglavlju <time.h> definirane su funkcije i strukture za rad s datumima i vremenom. Posebni typedef tip time_t, služi za bilježenje vremena. Obično se uzima da ovaj tip predstavlja broj sekundi počevši od 01.01.1970. godine. Za detaljniji zapis vremena i datuma koristi se struktura tm, koja se definira na sljedeći način: struct tm /* opisuje vrijeme i datum */ { int tm_sec; /* sekunde 0..61 */ int tm_min; /* minute 0..59 */ int tm_hour; /* sat 0..23 */ int tm_mday; /* dan 1..31 */ int tm_mon; /* mjesec 0..11 */ int tm_year; /* broj godina nakon 1900 */ int tm_wday; /* dan u sedmici 0..6 */ int tm_yday; /* dan u godini 0..365 */ int tm_isdst; /* da li je dan promjene sata 0..1 */ }; Napomena: ako dan promjene sata nije implementiran tada tm_isdst ima negativnu vrijednost. Broj sekundi može biti veći od 59 u slučaju prestupnog vremena. Mjeseci su kodiranu tako da 0 označava siječanj, 1 veljaču itd. Dani u sedmici su kodirani tako da 0 označava nedjelju, 1 ponedjeljak itd. Stvarna godina se dobije tako da se članu tm_year doda vrijednost 1900 (primjerice u godini 2002. godini član tm_year sadrži vrijednost 102). time time_t time(time_t *tp); Funkcija time() vraća time_t vrijednost kardinalni broj koji predstavlja trenutno vrijeme (obično je to broj sekundi od 1.1.1970.). Parametar tp, ako nije NULL, također prihvaća trenutno vrijeme u *tp. localtime, gmtime Dodatak C - standardna biblioteka C jezika 17
struct tm *localtime(const time_t *t); struct tm *gmtime(const time_t *t); Pretvorbu vremena iz formata time_t u struct tm vrši se funkcijom localtime(), kada se želi dobiti lokalno vrijeme, ili funkcijom gmtime() za dobiti univerzalno vrijeme u nultom meridijanu. Obje funkcije primaju adresu varijable koja sadrži vrijeme u formatu time_t, a vraćaju pokazivač na statičku strukturu tipa tm (sadržaj se obnavlja pri svakom pozivu ovih funkcija). ctime, asctime Ako se želi dobiti zapis vremena u obliku stringa, mogu se koristiti funkcije char *ctime(const time_t *t); char *asctime(const struct tm *tp); Funkcija ctime() za argument koristi adresu varijable koja sadrži vrijeme u formatu time_t, a funkcija asctime()za argument koristi pokazivač na strukturu tm. Obje funkcije vraćaju pokazivač statičkog stringa koji sadrži zapis vremena u standardnom formatu. Primjerice, sekvenca naredbi time_t t = time(null); char *s = ctime(&t); puts(s); generira ispis: Sat May 11 14:21:20 2002 Uočite da je rezultat poziva ctime(&t) ekvivalentan pozivu asctime(localtime(&t)). Standardna verzija je prilagođena američkim standardima. Ako se želi napisati vrijeme u formatu 11.05.2002 14:21 tada se može koristiti sljedeće iskaze: /* ispisuje datum i vrijeme u formatu 11.05.2002 14:21 */ time_t t = time(null); struct tm *p = localtime(&t); printf("%.2d.%.2d.%.2d %2d:%.2d\n", p->tm_mday, p->tm_mon + 1, p->tm_year +1900, p->tm_hour, p->tm_min); strftime size_t strftime(char *buf, size_t bufsize, const char *fmt, const struct tm *tp); Funkcija strftime() se koristi za formatirani ispis vremena. Format se zadaje kao kod printf() funkcije. Prvi argument je string str u koji se vrši formatirani zapis. Drugi argument (bufsize) ograničava broj znakova stringa. Treći parametar je string u kojem se zapisuje format ispisa nizom specifikatora oblika %x (kao kod printf() funkcije). Posljednji argument je pokazivač strukture tm. Funkcija vraća broj znakova u stringu ili 0 ako nije moguće generirati formatirani string. Specifikatori formata su: %a kratica od tri slova za ime dana u sedmici (eng. Sun, Mon, Tue,..) %A puno ime dana u sedmici (eng.) %b kratica od tri slova za ime mjeseca (eng. Jan, Feb, Mar,...) %B puno ime mjeseca (eng.) %c kompletni zapis vremena i datuma %d dan u mjesecu (1..31) %H sat u formatu (1..24) %I sat u formatu (1..12) %j dan u godini (1..365) Dodatak C - standardna biblioteka C jezika 18
%m mjesec u godini (1..12) %M minute %p AM/PM (eng.) string koji označava jutro ili popodne %S sekunde %U broj za sedmicu u godini (1..52) - 1 određen prvom nedjeljom %w broj za dan u sedmici (0-nedjelja) %W broj za sedmicu u godini (1..52) - 1 određen prvim ponedjeljkom %x kompletni zapis datuma %X kompletni zapis vremena %y zadnje dvije znamenke godine %Y godina u 4-znamenkastom formatu %Z ime vremenske zone (ako postoji ) %% znak % mktime time_t mktime(struct tm *tp); Funkcija mktime() pretvara zapisa iz strukture tm u time_t format. Korisna je u tzv. kalendarskim proračunima. Kada je potrebno dodati nekom datumu n dana, tada se može upisati datum u tm strukturu, povećati član tm_mday za n, zatim pozivom mktime() se dobije time_t vrijednost koja odgovara novom datumu. difftime double difftime(time_t t1, time_t t2); Funkcija difftime() vraća realnu vrijednost koja je jednaka razlici vremena t1 i t1 u sekundama. clock clock_t clock(void); Funkcija clock() služi za preciznije mjerenje vremena nego je to moguće sa prethodnim funkcijama. Ona vraća vrijednost procesorskog mjerača vremena, koji starta na početku programa, u jedinicama koje su znatno manje od sekunde (nekoliko milisekundi). Koliko je tih jedinica u jednoj sekundi određeno je konstantom CLOCKS_PER_SEC. To znači da izraz: (double)clock()/clocks_per_sec daje vrijednost koja je jednaka vremenu (u sekundama) od startanja programa. C 7 <signal.h> U zaglavlju <signal.h> deklarirane su dvije funkcije (signal() i raise()) za prihvat i generiranje asinkronih prekida programa ili "signala". Za identificiranje nekoliko mogućih signala, u ovom zaglavlju su definirane simboličke cjelobrojne konstante sa sljedećim imenima: SIGABRT SIGFPE SIGILL SIGINT SIGSEGV SIGTERM Signal kojeg generira funnkcija abort(). Signal koji se generira kad nastane greška kod matematičkih operacija primjerice pri djeljenju s nulom. Signal koji se generira ako se pokušava izvršiti nepostojeća ili nedozvoljena instrukcija procesora. Signal koj se generira s tipkovnce (primjerice, Ctrl-C tipkom). Signal koji se generira ako se pristupa zaštićenoj ili nepostojećoj memoriji ("segmentation violations"). Signal koji se generira kada je proces prekinut nekim vanjskim događajem. Dodatak C - standardna biblioteka C jezika 19
Ovisno o implementaciji kompilatora, moguće su i dodatne definicije identifikatora signala. raise int raise(int sig); Funkcija raise() šalje izvršnom programu signal sig. signal void (*signal(int sig, void (*func)(int)))(int); Funkcija signal() se koristi za definiranje akcije koja se treba izvršiti kada se pojavi neki signal. Ukoliko nije definirana radnja koja se vrši nakon pojave signala, prekida se program. Argument sig je signal kojeg treba prihvatiti (jedna od SIGxxx konstanti). Argument func je ili konstanta SIG_IGN (kojom se zahtijeva ignoriranje signala) ili konstanta SIG_DFL (kojom se postavlja predodređeni postupak prihvata signala) ili pokazivač na korisnički definiranu funkciju koja će se izvršiti pojavom signala. Ta funkcija mora imati prototip oblika void signalhandler(int sig); Argument ove funkcije tipa int je broj signala koji se prihvaća. Funkcija signal() vraća prethodni oblik prihvata signala; SIG_DFL, SIG_IGN, ili pokazivač na funkciju. Zbog navedenih svojstava, deklaracija funkcije signal() je kompleksna. To je funkcija koja vraća pokazivač na funkciju koja prima jedan argument tipa int i vraća void. Prvi argument je tipa int, a drugi argument je pokazivač na funkciju koja prima jedan argument tipa int i vraća void. Primjer: u sljedećem programskom odsječku pokazano je kako se postavlja poziv funkcije exithandler u slučaju pojave prekida (interrupt signal - SIGINT), ali samo ako taj signal nije prethodno ignoriran: extern void exithandler(int); if(signal(sigint, SIG_IGN)!= SIG_IGN) signal(sigint, exithandler); C 8 <setjmp.h> U zaglavlju <setjmp.h> deklarirane su funkcije setjmp() i longjmp(), pomoću kojih se može izvršiti skok u program i izvan funkcije. Točka u programu na koju se vrši skok označava se funkcijom setjmp(), koja pamti stanje stoga i registara procesora i trenutnu programsku lokaciju u objektu tipa jmp_buf. Kasnije se s bilo kojeg mjesta u programu može skočiti na ovu poziciju pozivom funkcije longjmp(). setjmp int setjmp(jmp_buf context); Funkcija setjmp() sprema trenutnu programsku lokaciju i stanje procesora u objekt context, koji je tipa jmp_buf, i vraća vrijednost 0. Kasnije, nakon poziva funkcije longjmp() povratna vrijednost se može promijeniti. longjmp void longjmp(jmp_buf context, int retval) Dodatak C - standardna biblioteka C jezika 20
Funkcija longjmp() vrši skok na stanje opisano u objektu context, koji je prethodno spremljen pozivom funkcija setjmp(). Skok se vrši na mjesto gdje je prethodno pozvana funkcija setjmp(), pa se sada vrši povrat iz funkcije setjmp()s vrijednošću retval. C 9 <locale.h> U zaglavlju <locale.h> deklarirane su dvije funkcije za lokalizirane postavke. Početno, program započima u "C" lokalizaciji, koja se zatim može promijeniti sa setlocale() funkcijom. Lokalnospecifične informacije se dijele u nekoliko kategorija, koje se označavaju sljdećim konstantama: LC_COLLATE LC_CTYPE LC_MONETARY LC_NUMERIC LC_TIME LC_ALL Usporedba stringova se vrši pomoću funkcija strcoll() i strxfrm() Klasiofikacija znakova pomoću funkcija iz <ctype.h> Monetarne postavke se dobiju funkcijom localeconv() Koristi decimalnu točku u funkcijama printf(), scanf()), strtod(), itd. Lokalizirani format strftime() funkcije Unija prethodnih postavki setlocale char *setlocale(int cat, const char *locale); Funkcija setlocale()ima dva argumenta. Prvi argument je oznaka kategorije koja se postavlja, a drugi parametar locale je string za oznaku lokalizacije. Ako taj string je jednak C, tada se koristi predodređena lokalizacija. Prazni string također označava predodređenu lokalizaciju. Sve ostale oznake su specifične za pojedinu implementaciju kompilatora. Funkcija vraća pokazivač na string koji sadrži prethodnu locale postavku. Ako se setlocale() pozove s locale = NULL tada funkcija vraća trenutnu postavku. localeconv struct lconv *localeconv(void); Funkcija localeconv() vraća pokazivač na strukturu lconv koja sadrži lokalno-specifične informacije. Ta struktura je otprilike definirana ovako: struct lconv { char *decimal_point; char *thousands_sep; char *grouping; char *int_curr_symbol; char *currency_symbol; char *mon_decimal_point; char *mon_thousands_sep; char *mon_grouping; char *positive_sign, *negative_sign; char int_frac_digits; char frac_digits; char p_cs_precedes, p_sep_by_space; char n_cs_precedes, n_sep_by_space; char p_sign_posn, n_sign_posn; }; decimal_point je oznaka koja se koristi za decimalni zarez. thousands_sep je separator koji se koristi između grupe znamenki grouping je string that defines veličinu grupe (primjerice "\3" označava da se ponavlje grupa od 3 znaka ). Dodatak C - standardna biblioteka C jezika 21
Ostali članovi opisuju monetarno-specifične informacije. Ukratko, int_curr_symbol i currency_symbol su verzije (internacionalne i lokalne) za lokalnu valutu, mon_decimal_point je decimalna točka, mon_thousands_sep i mon_grouping dopisuju grupiranje znamenki (analogno s thousands_sep i grouping), positive_sign i negative_sign su znakovi pozitivnog i negativnog predznaka, int_frac_digits i frac_digits opisuju broj decimalnih znamenki koje se prikazuju. Ostali članovi opisuju oznaku valute i inikatore predznaka. C 10 <stdarg.h> U zaglavlju <stdarg.h> su definirani makro naredbe pomoću kojih se omogućuje definiranje funkcija s promjenjljivim brojem parametara. Koristi se ideja da se argumentima neke funkcije pridijeli lista pokazivača koja ima apstraktni tip va_list. U tu svrhu koristi se makro va_start. Zatim se iz ove liste mogu dobiti svi argumenti pomoću makroa va_arg. Na kraju rada, unutar iste funkcije, treba pozvati makro va_end. va_start va_start(va_list argp, lastarg); va_start inicijalizira argp tako da se njime mogu dohvatiti argumenti. lastarg is je ime posljednjeg fiksnog argumenta funkcije. va_arg argtype va_arg(va_list argp, argtype); va_arg dobavlja vrijednost sljedećeg argumenta koji je tipa argtype. argtype se specificira na isti način kako se definira argument sizeof operatora. Tip mora odgovarati tipu sljedećeg argumenta. va_end va_end(va_list argp); va_end označava da je završen pristup promjenjljivoj listi argumenata. Primjer: u sljedećem programu definirana je funkcija miniprintf(), kojom je pokazano kako je implementirana printf() funkcija. #include <stdio.h> #include <stdarg.h> void miniprintf(const char *format,...) { va_list argp; const char *p; char tmpbuf[25]; int i; va_start(argp, format); for(p = format; *p!= '\0'; p++) { if(*p!= '%') { putchar(*p); continue; } switch(*++p) { case 'c': i = va_arg(argp, int); putchar(i); Dodatak C - standardna biblioteka C jezika 22
} break; case 'd': i = va_arg(argp, int); sprintf(tmpbuf, "%d", i); fputs(tmpbuf, stdout); break; case 'o': i = va_arg(argp, int); sprintf(tmpbuf, "%o", i); fputs(tmpbuf, stdout); break; case 's': fputs(va_arg(argp, char *), stdout); break; case 'x': i = va_arg(argp, int); sprintf(tmpbuf, "%x", i); fputs(tmpbuf, stdout); break; case '%': putchar('%'); break; } } va_end(argp); C 11 <stddef.h> U zaglavlju <stddef.h> definirano je nekoliko tipova i makro naredbi. NULL size_t ptrdiff_t wchar_t offsetof() Makro koji označava konstantu za null pokazivač (vrijednost mu je 0 ili (void *)0). Cjelobrojni unsigned tip koji se koristi za označavanje veličine memorijskog objekta. Cjelobrojni tip koji označava vrijednosti koji nastaju kod oduzimanja pokazivača. Tip wide character koji može imati znatno veći interval vrijednosti od tipa char. Koristi se za multinacionalni skup znakova (Unicode). Makro kojm se računa pomak (eng. offset) u bajtima nekog elementa strukture, primjerice offsetof(struct tm, tm_year). Korištenje ovih tipova osigurava portabilnost programa. C 12 <assert.h> U zaglavlju <assert.h> definar je makro assert, koji omogućuje testiranje pograma. void assert(int test_izraz) Ako je test_izraz jednak nuli, tada assert(test_izraz) šalje na stdderr poruku, poput ove: Assertion failed: test_izraz, file filename, line nnn Dodatak C - standardna biblioteka C jezika 23