You are on page 1of 100

Univerzitet u Sarajevu

Elektrotehniki fakultet Sarajevo

Osnove raunarstva 2016/2017

udnovate stvari
(sve to vam niko nije rekao o
pokazivaima i stringovima)
Doc. dr Vedran Ljubovi
Deklaracije stringova

Koja je razlika izmeu:


char s[10] = "Test";
char s[] = "Test";
char* s = "Test";

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 2


Deklaracije stringova

Niz od 10 elemenata:
char s[10] = "Test";

... 250 251 252 253 254 255 256 257 258 259 260 ...
... T e s t \0 ...

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 3


Deklaracije stringova

Niz od 5 elemenata:
char s[] = "Test";

... 250 251 252 253 254 255 256 257 258 259 260 ...
... T e s t \0 ...

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 4


Deklaracije stringova

Pokaziva na literal:
char* s = "Test";

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 256 T e s t \0 ...

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 5


Deklaracije stringova

Pokaziva na literal:
char* s = "Test";
Ovo je jedini nain u C-u da deklariemo pokaziva na
literal.
Bitno je da se ovakav string ne moe mijenjati! Npr. elimo
da spojimo dvije rijei sa razmakom izmeu:
printf("%s", spoji(rijec1, spoji(" ", rijec2)));

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 6


Deklaracije stringova

Pokaziva na literal:
char* s = "Test";
Ovo je jedini nain u C-u da deklariemo pokaziva na
literal.
Bitno je da se ovakav string ne moe mijenjati! Npr. elimo
da spojimo dvije rijei sa razmakom izmeu:
printf("%s", spoji(rijec1, spoji(" ", rijec2)));

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 7


Deklaracije stringova

Pokaziva na literal:
char* s = "Test";
Ovo je jedini nain u C-u da deklariemo pokaziva na
literal.
Bitno je da se ovakav string ne moe mijenjati! Npr. jer
Krahiranje, elimo
da spojimo dvije rijei sa razmakom izmeu: je " " literal
printf("%s", spoji(rijec1, spoji(" ", rijec2)));

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 8


Deklaracije stringova

Pokaziva na literal:
char* s = "Test";
Ovo je jedini nain u C-u da deklariemo pokaziva na
literal.
Bitno je da se ovakav string ne moe mijenjati! Npr. elimo
da spojimo dvije rijei sa razmakom izmeu:
printf("%s", spoji(rijec1, spoji(" ", rijec2)));
treba ovako:
char razmak[100] = " ";
printf("%s", spoji(rijec1, spoji(razmak, rijec2)));

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 9


Viestruki pokazivai

Dvostruki pokaziva je pokaziva koji pokazuje na


pokaziva:
int broj=5;
int* p = &broj;
int** dp = &p;

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 5 251 254 ...
broj p dp

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 10


Viestruki pokazivai

Trostruki pokaziva je pokaziva koji pokazuje na dvostruki


pokaziva itd.
int broj=5;
int* p = &broj;
int** dp = &p;
int*** tp = &dp;

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 5 251 259 254 ...
broj p tp dp

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 11


Viestruki pokazivai

Trostruki pokaziva je pokaziva koji pokazuje na dvostruki


pokaziva itd.
int broj=5;
int* p = &broj; printf("%d", *p);
int** dp = &p; printf("%d", **dp);
int*** tp = &dp; printf("%d", ***tp);

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 5 251 259 254 ...
broj p tp dp

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 12


Viestruki pokazivai

Trostruki pokaziva je pokaziva koji pokazuje na dvostruki


pokaziva itd.
int broj=5;
int* p = &broj; printf("%d", *p);
int** dp = &p; printf("%d", **dp);
int*** tp = &dp; printf("%d", ***tp);

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 5 251 259 254 ...
broj p tp dp

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 13


Viestruki pokazivai

Trostruki pokaziva je pokaziva koji pokazuje na dvostruki


pokaziva itd.
int broj=5;
int* p = &broj; printf("%d", *p);
int** dp = &p; printf("%d", **dp);
int*** tp = &dp; printf("%d", ***tp);

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 5 251 259 254 ...
broj p tp dp

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 14


Viestruki pokazivai

Trostruki pokaziva je pokaziva koji pokazuje na dvostruki


pokaziva itd.
int broj=5;
int* p = &broj; printf("%d", *p);
int** dp = &p; printf("%d", **dp);
int*** tp = &dp; printf("%d", ***tp);

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 5 251 259 254 ...
broj p tp dp

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 15


Viestruki pokazivai

Trostruki pokaziva je pokaziva koji pokazuje na dvostruki


pokaziva itd.
int broj=5; 5
int* p = &broj; printf("%d", *p);
int** dp = &p; printf("%d", **dp);
int*** tp = &dp; printf("%d", ***tp);

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 5 251 259 254 ...
broj p tp dp

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 16


Viestruki pokazivai

Trostruki pokaziva je pokaziva koji pokazuje na dvostruki


adresa promjenljive
broj
pokaziva itd.
int broj=5;
int* p = &broj; p = 251 (int*)
int** dp = &p; *dp = 251 (int*)
int*** tp = &dp; **tp = 251 (int*)

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 5 251 259 254 ...
broj p tp dp

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 17


Viestruki pokazivai

Trostruki pokaziva je pokaziva koji pokazuje na dvostruki


pokaziva itd. adresa promjenljive
broj
int broj=5;
int* p = &broj; p = 251 (int*)
int** dp = &p; *dp = 251 (int*)
int*** tp = &dp; **tp = 251 (int*)

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 5 251 259 254 ...
broj p tp dp

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 18


Viestruki pokazivai

Trostruki pokaziva je pokaziva koji pokazuje na dvostruki


pokaziva itd.
int broj=5;
int* p = &broj; p = 251 (int*)
int** dp = &p; *dp = 251 (int*)
int*** tp = &dp; **tp = 251 (int*)

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 5 251 259 254 ...
broj p tp dp

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 19


Viestruki pokazivai

Trostruki pokaziva je pokaziva koji pokazuje na dvostruki


pokaziva itd. adresa promjenljive
int broj=5; p
int* p = &broj;
int** dp = &p; dp = 254 (int**)
int*** tp = &dp; *tp = 254 (int**)

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 5 251 259 254 ...
broj p tp dp

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 20


Viestruki pokazivai

Trostruki pokaziva je pokaziva koji pokazuje na dvostruki


pokaziva itd.
int broj=5;
int* p = &broj;
int** dp = &p; dp = 254 (int**)
int*** tp = &dp; *tp = 254 (int**)

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 5 251 259 254 ...
broj p tp dp

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 21


Da li je niz isto to i pokaziva?

Ime niza nije isto to i pokaziva na prvi element niza!


Ali ime niza se po potrebi konvertuje u pokaziva na prvi
element niza:
int niz[3];
int* p = niz;
Izuzetak je prototip funkcije gdje int niz[] je zaista isto
to i int* niz (samo druga sintaksa).

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 22


Niz pokazivaa

Mogue je deklarisati niz elemenata bilo kojeg tipa, pa i


pokazivaa:
float* niz[10];
Primjer:
char* datum[3] = {"19.", "Januar", "2016."};
printf("%s", datum[1]);

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 253 257 264 1 9 . \0 J a n u ...

... 261 262 263 264 265 266 267 268 269 270 271 ...
... a r \0 2 0 1 6 . \0 ...

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 23


Niz pokazivaa

Mogue je deklarisati niz elemenata bilo kojeg tipa, pa i


pokazivaa:
float* niz[10];
Primjer: Ispisae: Januar

char* datum[3] = {"19.", "Januar", "2016."};


printf("%s", datum[1]);

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 253 257 264 1 9 . \0 J a n u ...

... 261 262 263 264 265 266 267 268 269 270 271 ...
... a r \0 2 0 1 6 . \0 ...

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 24


Niz pokazivaa

Mogue je deklarisati niz elemenata bilo kojeg tipa, pa i


pokazivaa:
float* niz[10];
Primjer: Ispisae: Januar

char* datum[3] = {"19.", "Januar", "2016."};


printf("%s", datum[1]);
Niz pokazivaa "datum"
... 250 251 252 253 254 255 256 257 258 259 260 ...
... 253 257 264 1 9 . \0 J a n u ...

... 261 262 263 264 265 266 267 268 269 270 271 ...
... a r \0 2 0 1 6 . \0 ...

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 25


Niz pokazivaa

Mogue je deklarisati niz elemenata bilo kojeg tipa, pa i


pokazivaa:
float* niz[10];
Primjer: Ispisae: Januar

char* datum[3] = {"19.", "Januar", "2016."};


printf("%s", datum[1]); Literali se nalaze
"negdje" u memoriji
Niz pokazivaa "datum"
... 250 251 252 253 254 255 256 257 258 259 260 ...
... 253 257 264 1 9 . \0 J a n u ...

... 261 262 263 264 265 266 267 268 269 270 271 ...
... a r \0 2 0 1 6 . \0 ...

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 26


Niz pokazivaa vs. matrica

Ovako deklarisan niz pokazivaa nije isto to i matrica:


char mat[3][10] = {"19.", "Januar", "2016."};
printf("%s", mat[1]);

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 1 9 . \0 J ...

... 261 262 263 264 265 266 267 268 269 270 271 ...
... a n u a r \0 2 0 ...

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 27


Niz pokazivaa vs. matrica

Ovako deklarisan niz pokazivaa nije isto to i matrica:


char mat[3][10] = {"19.", "Januar", "2016."};
printf("%s", mat[1]);

Nema niza
pokazivaa

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 1 9 . \0 J ...

... 261 262 263 264 265 266 267 268 269 270 271 ...
... a n u a r \0 2 0 ...

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 28


Niz pokazivaa vs. matrica

Ime niza pokazivaa konvertuje se u dvostruki pokaziva:


char* datum[3] = {"19.", "Januar", "2016."};
char** dp = datum;
printf("%s", dp[1]);
Ime matrice se konvertuje u "pokaziva na niz":
char mat[3][10] = {"19.", "Januar", "2016."};
char (*ap)[10] = mat;
printf("%s", ap[1]);
char** dp = mat;

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 29


Niz pokazivaa vs. matrica

Ime niza pokazivaa konvertuje se u dvostruki pokaziva:


char* datum[3] = {"19.", "Januar", "2016."};
char** dp = datum;
printf("%s", dp[1]);
Ime matrice se konvertuje u "pokaziva na niz":
char mat[3][10] = {"19.", "Januar", "2016."};
char (*ap)[10] = mat;
printf("%s", ap[1]);
char** dp = mat;

Upozorenje: initialization from


incompatible pointer type

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 30


Niz pokazivaa vs. matrica

Ime niza pokazivaa konvertuje se u dvostruki pokaziva:


char* datum[3] = {"19.", "Januar", "2016."};
char** dp = datum;
Tip promjenljive ap je
printf("%s",
"pokaziva na niz od dp[1]);
10 elemenata tipa char"
Ime matrice se konvertuje u "pokaziva na niz":
char mat[3][10] = {"19.", "Januar", "2016."};
char (*ap)[10] = mat;
printf("%s", ap[1]);
char** dp = mat;

Upozorenje: initialization from


incompatible pointer type

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 31


Niz pokazivaa vs. matrica

Ime niza pokazivaa konvertuje se u dvostruki pokaziva:


char* datum[3] = {"19.", "Januar", "2016."};
char** dp = datum;
Tip promjenljive ap je
printf("%s",
"pokaziva na niz od dp[1]);
10 elemenata tipa char"
Ime matrice se konvertujeTakav
u "pokaziva na niz":
tip nam je potreban
da bismo znali da je ap+1
char mat[3][10] = {"19.", "Januar",
za 10 bajta vee od ap "2016."};
char (*ap)[10] = mat;
printf("%s", ap[1]);
char** dp = mat;

Upozorenje: initialization from


incompatible pointer type

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 32


Niz pokazivaa vs. matrica

Ime niza pokazivaa konvertuje se u dvostruki pokaziva:


char* datum[3]Zagrade
= {"19.",
su potrebne"Januar", "2016."};
kako bi se razlikovalo
char** dp = datum;
Tip promjenljive ap je oddp[1]);
niza od 10 pokazivaa
printf("%s",
"pokaziva na niz od
10 elemenata tipa char"
Ime matrice se konvertujeTakav
u "pokaziva na niz":
tip nam je potreban
da bismo znali da je ap+1
char mat[3][10] = {"19.", "Januar",
za 10 bajta vee od ap "2016."};
char (*ap)[10] = mat;
printf("%s", ap[1]);
char** dp = mat;

Upozorenje: initialization from


incompatible pointer type

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 33


Slanje matrice u funkciju

Kada aljemo niz u funkciju mi ustvari aljemo pokaziva


na prvi lan niza (adresu).
A kada aljemo matricu, ustvari aljemo pokaziva na niz
koji predstavlja jedan red matrice.
Mora se navesti jedna dimenzija matrice!
Dakle funkcije koje rade sa matricama ne mogu biti
potpuno univerzalne.
Zbog toga radije koristimo nizove pokazivaa.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 34


Slanje matrice u funkciju

Primjer:
#include <stdio.h>
int primimatricu(int (*mat)[10], int redova) {
printf("%d", mat[0][0]);
}
int main() {
int matrica[10][10] = {{15}};
primimatricu(matrica, 10);
return 0;
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 35


Parametri funkcije main

Funkcija main ima dva oblika. Do sada smo uvijek koristili


oblik bez parametara. Pored toga postoji oblik sa dva
parametra:
int main(int argc, char** argv)
Svakom programu se mogu poslati parametri putem
komandne linije.
argc je broj parametara, a argv je pokaziva na prvi lan
niza pokazivaa na stringove koji predstavljaju tekst
parametara.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 36


Parametri funkcije main

Primjer:
int main(int argc, char** argv) {
int i;
printf("Program ima %d parametara.\n", argc);
printf("Ti parametri su:\n");
for (i=0; i<argc; i++)
printf("%s\n", argv[i]);
return 0;
}
Prvi parametar je uvijek ime samog programa.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 37


Primjer: sortiranje

Napisati funkciju koja abecedno sortira niz stringova.


Najprije moramo definisati: da li funkcija prima matricu
tipa char ili niz pokazivaa tipa char?
Deklaracija funkcije bi izgledala:
void sortiraj(char** niz, int n)
void sortiraj(char(*mat)[100], int n)
Koristiemo Selection sort koji smo obradili na kraju
poglavlja 10.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 38


Primjer: sortiranje

Selection sort (Predavanje 10):


for (i=0; i<n; i++) {
min=i;
for (j=i+1; j<n; j++) {
if (niz[j] < niz[min])
min = j;
}

temp = niz[i];
niz[i] = niz[min];
niz[min] = temp;
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 39


Primjer: sortiranje

Selection sort (Predavanje 10):


for (i=0; i<n; i++) Ne
{ moemo ovako
porediti stringove
min=i;
for (j=i+1; j<n; j++) {
if (niz[j] < niz[min])
min = j;
}

temp = niz[i];
niz[i] = niz[min];
niz[min] = temp;
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 40


Primjer: sortiranje

Selection sort (Predavanje 10):


for (i=0; i<n; i++) Ne { moemo ovako
porediti stringove
min=i;
for (j=i+1; j<n; j++) {
if (niz[j] < niz[min])
minDodjela
= j;nizova ne
} radi znakom =

temp = niz[i];
niz[i] = niz[min];
niz[min] = temp;
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 41


Primjer: sortiranje

Selection sort (Predavanje 10):


for (i=0; i<n; i++) Ne { moemo ovako
porediti stringove
min=i;
for (j=i+1; j<n; j++) {
if (niz[j] < niz[min])
minDodjela
= j;nizova ne
} radi znakom =

temp = niz[i];
niz[i] = niz[min]; Trebamo koristiti
funkcije strcmp
niz[min] = temp; i strcpy
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 42


Primjer: sortiranje

void sortiraj(char** niz, int n) {


int i, j, min, temp;
for (i=0; i<n; i++) {
min=i;
for (j=i+1; j<n; j++) {
if (strcmp(niz[j],niz[min]) < 0)
min = j;
}

temp = niz[i];
niz[i] = niz[min];
niz[min] = temp;
}
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 43


Primjer: sortiranje

void sortiraj(char** niz, int n) {


int i, j, min, temp;
for (i=0; i<n; i++) {
min=i;
for (j=i+1; j<n; j++) {
if (strcmp(niz[j],niz[min]) < 0)
min = j;
}

???
temp = niz[i];
niz[i] = niz[min];
niz[min] = temp;
}
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 44


Primjer: sortiranje

U sluaju niza pokazivaa moemo samo razmijeniti


pokazivae:
D a n a s \0

j e \0

b i o \0

l i j e p \0

d a n \0

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 45


Primjer: sortiranje

U sluaju niza pokazivaa moemo samo razmijeniti


pokazivae:
D a n a s \0

j e \0

b i o \0

l i j e p \0

d a n \0

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 46


Primjer: sortiranje

void sortiraj(char** niz, int n) {


int i, j, min; char* temp;
for (i=0; i<n; i++) {
min=i;
for (j=i+1; j<n; j++) {
if (strcmp(niz[j],niz[min]) < 0)
min = j;
}

temp = niz[i];
niz[i] = niz[min];
niz[min] = temp;
}
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 47


Primjer: sortiranje

void sortiraj(char** niz, int n) {


int i, j, min; char* temp;
for (i=0; i<n; i++) {
min=i;
for (j=i+1; j<n; j++) {
if (strcmp(niz[j],niz[min]) < 0)
min = j;
} Razmijenili smo
pokazivae u nizu
temp = niz[i];
niz[i] = niz[min];
niz[min] = temp;
}
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 48


Kljuna rije const

Pored simbolikih konstanti koje smo deklarisali


preprocesorskom direktivom #define postoje i konstante
koje se deklariu tako to prije tipa navede kljuna rije
const
const int x=5;
Poto je x konstantno ne moe se mijenjati.
Ipak treba napomenuti da x iznad ustvari nije konstanta! U
programskom jeziku C to je promjenljiva koja se ne moe
mijenjati direktno (ali moe preko pokazivaa).

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 49


Usporedba konstanti

#define konstante se bukvalno zamjenjuju u kodu prije


kompajliranja, tako da ne zauzimaju nikakvu memoriju. S
druge strane, dobar kompajler e isto napraviti i sa const
promjenljivim ako je mogue.
#define konstante su uvijek globalne, a const imaju opseg.
#define konstante nemaju eksplicitno definisan tip. Njihov
tip ovisi od vrijednosti koja im je dodijeljena.
#define se ne moe promijeniti preko pokazivaa.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 50


Konstantni pokazivai

char* const a = s;
Ovim je deklarisan konstantni pokaziva a koji sada moe
pokazivati samo na s i ni na ta drugo (ne moe se pomjerati).
const char* b = s;
Pokaziva koji pokazuje na konstantne podatke. Pokaziva se
moe usmjeriti negdje drugo, ali se ono na ta on pokazuje ne
moe mijenjati. Primjer:
*a = x; /* Moze */
a = &x; /* Ne moze */
*b = x; /* Ne moze */
b = &x; /* Moze */

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 51


Konstantni pokazivai

const char* const c = s;


Sa ovakvom deklaracijom ne moe se mijenjati ni adresa
pohranjena u pokazivau ni ono to je na toj adresi.
Pokaziva na konstante podatke se esto koristi kada se u
funkciju alje niz ali se eli zabraniti da se niz mijenja u
funkciji. Npr.
int dajmax(const int* niz, int vel)
Na ovaj nain autori funkcije nas obavjetavaju da se u
funkciji nee promijeniti lanovi niza.
Ova ogranienja se mogu zaobii konverzijom (cast).

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 52


Konstantni pokazivai

U nekim kompajlerima moete dobiti upozorenje ako


pridruujete string literal pokazivau koji nije konstantan:
char* s = "Test";
Konkretno ovo se deava sa C++ kompajlerom. Treba
pisati:
const char* s = "Test";
Takoer ako oekujete da se funkcija moe pozivati sa
literalom trebali biste navesti const char* kao tip
parametra.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 53


Pokazivai na funkcije

Mogue je deklarisati pokaziva koji pokazuje na funkciju.


To je korisno kako bi se funkciji mogla proslijediti druga
funkcija kao parametar.
Deklaracija pokazivaa na funkciju:
TIP (*ime_pokazivaca)([tip,tip,tip...])

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 54


Pokazivai na funkcije

Primjer:

int kvadrat(int x) {
return x*x;
}
...
int (*p)(int) = kvadrat;

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 55


Pokazivai na funkcije

Primjer:

int kvadrat(int x) {
return x*x;
} Deklarisana je
promjenljiva p
...
int (*p)(int) = kvadrat;

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 56


Pokazivai na funkcije

Primjer:

int kvadrat(int x) {
return x*x;
} Deklarisana je
promjenljiva p
...
int (*p)(int) = kvadrat;

Tip promjenljive je:


"pokaziva na funkciju koja ima
jedan parametar tipa int i
vraa vrijednost tipa int"

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 57


Pokazivai na funkcije

Primjer:

int kvadrat(int x) {
return x*x;
} Deklarisana je Pokaziva pokazuje
promjenljiva p na funkciju kvadrat
...
int (*p)(int) = kvadrat;

Tip promjenljive je:


"pokaziva na funkciju koja ima
jedan parametar tipa int i
vraa vrijednost tipa int"

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 58


Pokazivai na funkcije

Primjer:

int kvadrat(int x) {
return x*x;
} Deklarisana je Pokaziva pokazuje
promjenljiva p na funkciju kvadrat
...
int (*p)(int) = kvadrat;

Tip promjenljive je:


Ime funkcije
"pokaziva na funkciju koja ima
(bez zagrada) je
jedan parametar tipa int i
pokaziva na tu
vraa vrijednost tipa int"
funkciju

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 59


Pokazivai na funkcije

Pokaziva se mora slagati sa funkcijom po tipu i broju


parametara i tipu povratne vrijednosti.
int kvadrat(int x) {
return x*x;
}
...
int (*p)(int) = kvadrat;
void (*p2)(int) = kvadrat;
int (*p3)(int,int) = kvadrat;

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 60


Pokazivai na funkcije

Pokaziva se mora slagati sa funkcijom po tipu i broju


parametara i tipu povratne vrijednosti.
int kvadrat(int x) {
return x*x;
}
...
int (*p)(int) = kvadrat;
void (*p2)(int) = kvadrat;
int (*p3)(int,int) = kvadrat;

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 61


Pokazivai na funkcije

Preko pokazivaa se moe pozvati funkcija na koju


pokazuje:
int kvadrat(int x) {
return x*x;
}
...
int (*p)(int) = kvadrat;
k = (*p)(5);

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 62


Pokazivai na funkcije

Preko pokazivaa se moe pozvati funkcija na koju


pokazuje:
int kvadrat(int x) {
return x*x;
}
... Da bismo pozvali funkciju
dereferenciramo pokaziva p
int (*p)(int) = kvadrat;
k = (*p)(5);

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 63


Pokazivai na funkcije

Preko pokazivaa se moe pozvati funkcija na koju


pokazuje:
int kvadrat(int x) {
return x*x;
}
... Da bismo pozvali funkciju
dereferenciramo pokaziva p
int (*p)(int) = kvadrat;
k = (*p)(5);

Parametar funkcije
je broj 5

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 64


Pokazivai na funkcije

Preko pokazivaa se moe pozvati funkcija na koju


pokazuje:
int kvadrat(int x) {
return x*x;
}
... Da bismo pozvali funkciju
dereferenciramo pokaziva p
int (*p)(int) = kvadrat;
k = (*p)(5);

Parametar funkcije
k e biti 25 je broj 5

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 65


emu to slui?

Pokazivai na funkcije se najee koriste da bi se funkcija


poslala kao parametar funkcije:
int kvadrat(int x) { return x*x; }
int kub(int x) { return x*x*x; }
void izracunaj(int* niz, int vel, int (*fun)(int)) {
int i;
for (i=0; i<vel; i++)
niz[i] = (*fun)(niz[i]);
}
...
/* kvadriraj sve clanove niza */
izracunaj(niz, 100, kvadrat);
/* kubiraj sve clanove niza */
izracunaj(niz2, 100, kub);

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 66


void pokaziva

Mogue je definisati pokazivae na sve poznate tipove u


C-u, pa i nizove (to smo vidjeli ranije).
Pored toga mogue je definisati generiki pokaziva void*
za koji nije poznat tip vrijednosti na koju pokazuje.
void* p;
Koristi se kada tip nije unaprijed poznat nego e kasnije
biti odreen.
Nad void* nije mogue primjenjivati pokazivaku aritmetiku
jer se ne moe znati za koliko bajta treba pomjeriti
pokaziva.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 67


void pokaziva

Primjer:
void* p;
...
if (tip == INT_TIP)
printf("%d", *(int*)p);
Prije upotrebe void* moramo pretvoriti (cast) u neki drugi
tip.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 68


void pokaziva

Primjer:
void* p; Konvertujemo u
... pokaziva na int
if (tip == INT_TIP)
printf("%d", *(int*)p);
Prije upotrebe void* moramo pretvoriti (cast) u neki drugi
tip.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 69


void pokaziva

Primjer:
Tako dobiveni pokaziva
void* p; dereferenciramo kako bismo
... dobili cijeli broj
if (tip == INT_TIP)
printf("%d", *(int*)p);
Prije upotrebe void* moramo pretvoriti (cast) u neki drugi
tip.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 70


Dinamika alokacija memorije

Kako da dobijemo niz stvarno proizvoljne veliine? Pomou


dinamike alokacije!
Funkcija za dinamiku alokaciju je malloc i nalazi se u
biblioteci stdlib.h
Funkcija ima jedan parametar broj bajta koliko treba zauzeti
u memoriji, a vraa void pokaziva na zauzetu memoriju.
Npr. ako nam treba niz od 10 vrijednosti tipa int, potrebno
nam je 40 bajta.
Da bi kod radio na razliitim platformama piemo
10*sizeof(int)

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 71


sizeof operator

Jedan od operatora u programskom jeziku C je sizeof


unarni operator.
Daje veliinu u memoriji vrijednosti sa desne strane
int niz[] = { 7, 5, 0, 3, 7, 2 };
printf("%d", sizeof niz);
Ako se u zagradama navede tip, daje veliinu tog tipa
printf("%d", sizeof(double));
Operator sizeof vraa vrijednost tipa size_t koji je na PC-u
ekvivalentan long unsigned int (zbog ega gornje naredbe
daju upozorenje).

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 72


sizeof operator

Jedan od operatora u programskom jeziku C je sizeof


unarni operator.
Daje veliinu u memoriji vrijednosti sa desne strane
Ispisae: 24
int niz[] = { 7, 5, 0, 3, 7, 2 };
printf("%d", sizeof niz);
Ako se u zagradama navede tip, daje veliinu tog tipa
printf("%d", sizeof(double));
Operator sizeof vraa vrijednost tipa size_t koji je na PC-u
ekvivalentan long unsigned int (zbog ega gornje naredbe
daju upozorenje).

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 73


Curenje memorije

Sva memorija zauzeta funkcijom malloc mora se


osloboditi funkcijom free.
Ako se memorija ne oslobodi dolazi do curenja memorije
(eng. memory leak)
Program radi ispravno ali zauzima sve vie i vie
memorije to izaziva postepeno usporenje raunara.
Po zavretku programa memorija se oslobaa, ali treba se
vjebati da se sva zauzeta memorija oslobodi zbog
programa koji dugo stoje pokrenuti.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 74


Primjer dinamike alokacije
#include <stdio.h>
#include <stdlib.h>
int main() {
int vel, i;
int* niz;
printf("Unesite velicinu niza: ");
scanf("%d", &vel);
niz = (int*)malloc(vel * sizeof(int));
printf("Unesite clanove niza: ");
for (i=0; i<vel; i++)
scanf("%d", niz[i]);
/* ... radimo kao sa obicnim nizom */
free(niz);
return 0;
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 75


Primjer 2

Zadatak: Program omoguuje korisniku da unese niz od


najvie 100 rijei pri emu svaka rije ima najvie 99 slova.
Unos se zavrava sa dva minusa "--"...
char rijeci[100][100];
Deklaracijom iznad smo zauzeli 10000 bajta od ega je
veina neiskoriteno.
Da bismo to izbjegli, koristimo niz pokazivaa pri emu
svaki pokazuje na dinamiki alocirani string koji je tano
onoliko velik koliko je potrebno.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 76


Primjer 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int i, vel=0;
char* rijeci[100];
printf("Unesite rijeci (-- za kraj): ");
do {
char rijec[100];
unesi(rijec, 100);
rijeci[vel] = (char*)malloc(strlen(rijec) + 1);
strcpy(rijeci[vel++], rijec);
} while (strcmp(rijec, "--") != 0);
/* ... */
for (i=0; i<vel; i++)
free(rijeci[i]);
return 0;
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 77


Primjer 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h> Niz od 100 pokazivaa tipa char
int main() {
int i, vel=0;
char* rijeci[100];
printf("Unesite rijeci (-- za kraj): ");
do {
char rijec[100];
unesi(rijec, 100);
rijeci[vel] = (char*)malloc(strlen(rijec) + 1);
strcpy(rijeci[vel++], rijec);
} while (strcmp(rijec, "--") != 0);
/* ... */
for (i=0; i<vel; i++)
free(rijeci[i]);
return 0;
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 78


Primjer 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h> Niz od 100 pokazivaa tipa char
int main() {
int i, vel=0;
char* rijeci[100];
Unosimo rije u niz
printf("Unesite rijeci (-- za kraj): ");
do { od 100 elemenata
char rijec[100];
unesi(rijec, 100);
rijeci[vel] = (char*)malloc(strlen(rijec) + 1);
strcpy(rijeci[vel++], rijec);
} while (strcmp(rijec, "--") != 0);
/* ... */
for (i=0; i<vel; i++)
free(rijeci[i]);
return 0;
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 79


Primjer 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h> Niz od 100 pokazivaa tipa char
int main() {
int i, vel=0;
char* rijeci[100];
Unosimo rije u niz
printf("Unesite rijeci (-- za kraj): ");
do { od 100 elemenata Dinamiki alociramo onoliko
char rijec[100]; bajta koliko je dugaka rije + 1
unesi(rijec, 100);
rijeci[vel] = (char*)malloc(strlen(rijec) + 1);
strcpy(rijeci[vel++], rijec);
} while (strcmp(rijec, "--") != 0);
/* ... */
for (i=0; i<vel; i++)
free(rijeci[i]);
return 0;
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 80


Primjer 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h> Niz od 100 pokazivaa tipa char
int main() {
int i, vel=0;
char* rijeci[100];
Unosimo rije u niz
Dodajemo pokaziva na rijeci (-- za kraj): ");
printf("Unesite
do { od 100 elemenata Dinamiki alociramo onoliko
novu memoriju u niz
char rijec[100]; bajta koliko je dugaka rije + 1
unesi(rijec, 100);
rijeci[vel] = (char*)malloc(strlen(rijec) + 1);
strcpy(rijeci[vel++], rijec);
} while (strcmp(rijec, "--") != 0);
/* ... */
for (i=0; i<vel; i++)
free(rijeci[i]);
return 0;
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 81


Primjer 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h> Niz od 100 pokazivaa tipa char
int main() {
int i, vel=0;
char* rijeci[100];
Unosimo rije u niz
Dodajemo pokaziva na rijeci (-- za kraj): ");
printf("Unesite
do { od 100 elemenata Dinamiki alociramo onoliko
novu memoriju u niz
char rijec[100]; bajta koliko je dugaka rije + 1
unesi(rijec, 100);
rijeci[vel] = (char*)malloc(strlen(rijec) + 1);
strcpy(rijeci[vel++], rijec);
} while (strcmp(rijec, "--") != 0);
/* ... */
for (i=0; i<vel; i++) Kopiramo rije iz privremenog
free(rijeci[i]);
stringa u alociranu memoriju
return 0;
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 82


Primjer 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h> Niz od 100 pokazivaa tipa char
int main() {
int i, vel=0;
char* rijeci[100];
Unosimo rije u niz
Dodajemo pokaziva na rijeci (-- za kraj): ");
printf("Unesite
do { od 100 elemenata Dinamiki alociramo onoliko
novu memoriju u niz
char rijec[100]; bajta koliko je dugaka rije + 1
unesi(rijec, 100);
rijeci[vel] = (char*)malloc(strlen(rijec) + 1);
strcpy(rijeci[vel++], rijec);
} while (strcmp(rijec, "--") != 0);
/* ... */
for (i=0; i<vel; i++) Kopiramo rije iz privremenog
free(rijeci[i]);
stringa u alociranu memoriju
return 0;
}

Po zavretku rada treba


osloboditi zauzetu memoriju
10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 83
Primjer 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h> Niz od 100 pokazivaa tipa char
int main() {
int i, vel=0;
char* rijeci[100]; Mogli smo
Unosimo rije u niz
Dodajemo pokaziva na rijeci (-- za kraj): ");
printf("Unesite
do {
novu memoriju u niz dinamiki alocirati i
od 100 elemenata Dinamiki alociramo onoliko
char rijec[100]; bajta koliko je dugaka rije + 1
unesi(rijec, 100); sam niz pokazivaa!
rijeci[vel] = (char*)malloc(strlen(rijec) + 1);
strcpy(rijeci[vel++], rijec);
} while (strcmp(rijec, "--") != 0);
/* ... */
for (i=0; i<vel; i++) Kopiramo rije iz privremenog
free(rijeci[i]);
stringa u alociranu memoriju
return 0;
}

Po zavretku rada treba


osloboditi zauzetu memoriju
10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 84
Primjer 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int i, vel=0;
char** rijeci;
printf ("Unesite broj rijeci: ");
scanf("%d", &vel);
rijeci = (char**)malloc(vel * sizeof(char*));
printf("Unesite rijeci (-- za kraj): ");
/* ... */
for (i=0; i<vel; i++)
free(rijeci[i]);
free(rijeci);
return 0;
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 85


Primjer 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int i, vel=0;
char** rijeci;
printf ("Unesite broj rijeci: ");
scanf("%d", &vel);
rijeci = (char**)malloc(vel * sizeof(char*));
printf("Unesite rijeci (-- za kraj): ");
/* ... */
for (i=0; i<vel; i++)
free(rijeci[i]); Prvo treba osloboditi
free(rijeci); lanove niza...
return 0;
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 86


Primjer 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int i, vel=0;
char** rijeci;
printf ("Unesite broj rijeci: ");
scanf("%d", &vel);
rijeci = (char**)malloc(vel * sizeof(char*));
printf("Unesite rijeci (-- za kraj): ");
/* ... */
for (i=0; i<vel; i++)
free(rijeci[i]); Prvo treba osloboditi
free(rijeci); lanove niza...
return 0;
}
...pa onda i sam niz!

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 87


qsort

Bibliotena funkcija za sortiranje qsort nalazi se u


biblioteci stdlib.h.
int poredjenje(const void* a, const void* b) {
int aint = *((int*)a);
int bint = *((int*)b);
return aint<bint;
}
qsort (niz, vel, sizeof(int), poredjenje);
Poto qsort "ne zna" kojeg tipa je niz, pravi se funkcija
komparator koja prima dva const void* pokazivaa.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 88


Jo neke korisne funkcije za rad sa stringovima

Funkcije iz biblioteke string.h strcat i strcpy smatraju se


nesigurnim. Primjer:
void funkcija(char* s) {
char pomocni[100];
strcpy(pomocni, s); /* Primljeni string ce imati
najvise 100 znakova */
...

ta ako primljeni string bude ipak imao vie od 100


znakova???
U C++ programskom jeziku ove funkcije se smatraju za
prevaziene (deprecated) i dobiete upozorenje ako ih koristite.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 89


Jo neke korisne funkcije za rad sa stringovima

Funkcije iz biblioteke string.h strcat i strcpy smatraju se


nesigurnim. Primjer:
void funkcija(char* s) {
char pomocni[100];
strcpy(pomocni, s); /* Primljeni string ce imati
najvise 100 znakova */
...

ta ako primljeni string bude ipak imao vie od 100


znakova???
Korisnik koji moe funkciji
U C++ programskom jeziku
poslatiove funkcije
vie od se smatraju za
100 karaktera
prevaziene (deprecated)
moe ipisati
dobiete upozorenje
po memoriji ta eli! ako ih koristite.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 90


strncat i strncpy

Umjesto njih koristite strncat i strncpy. Primjer:


void funkcija(char* s) {
char pomocni[100];
strncpy(pomocni, s, 100);
pomocni[99] = '\0';
...

Iz stringa s u string pomoni e biti kopirano najvie 100


karaktera. Primjer strncat:
void funkcija(char* s1, char* s2) {
char pomocni[100];
strncpy(pomocni, s1, 100);
pomocni[99] = '\0';
strncat(pomocni, s2, 99-strlen(s1));
...

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 91


strtok funkcija
Jo jedna korisna funkcija u biblioteci string.h je strtok
(skraeno od string tokenizer).
Ova funkcija "sjecka" primljeni string po nekom iz niza karaktera.

Kada prvi put pozovemo funkciju aljemo joj string i niz
delimitera (razdjelnika). Svaki sljedei put aljemo nul-pokaziva
kao prvi parametar kako bismo oznaili da i dalje radimo sa istim
stringom, a dobiemo pokaziva na sljedei podstring.
Ovo je primjer bibliotene funkcije koja ne daje uvijek isti
rezultat za iste parametre (koristi statike promjenljive).
Funkcija strtok unitava polazni string jer ubacuje \0 na
mjestu svakog delimitera.

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 92


strtok funkcija

Primjer:
#include <stdio.h>
#include <string.h>
int main() {
char tekst[] = " Ovo, za pocetak,, je neki
primjer.";
char* p;
p = strtok(tekst, " .,");
while (p != NULL) {
printf("Rijec: %s\n", p);
p = strtok(NULL, " .,");
}
return 0;
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 93


strtok funkcija

Primjer:
#include <stdio.h>
#include <string.h>
int main() {
char tekst[] = " Ovo, za string
Cjepkamo pocetak,, je neki
po znakovima
primjer."; razmak, taka i zarez
char* p;
p = strtok(tekst, " .,");
while (p != NULL) {
printf("Rijec: %s\n", p);
p = strtok(NULL, " .,");
}
return 0;
}

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 94


strtok funkcija

Primjer:
#include <stdio.h>
#include <string.h>
int main() {
char tekst[] = " Ovo,
Cjepkamoza string
pocetak,, je neki
po znakovima
primjer."; razmak, taka i zarez
char* p;
p = strtok(tekst, " .,");
while (p != NULL) {
printf("Rijec: %s\n", p);
p = strtok(NULL, " .,");
}
return 0;
} Nakon posljednje rijei
dobiemo NULL

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 95


sprintf funkcija

Funkcija sprintf iz biblioteke stdio.h radi slino kao printf


samo to umjesto na ekran upisuje tekst u string.
char str[10];
int a=5, b=7;
sprintf(str, "%d+%d=%d", a, b, a+b);
String str sada glasi:

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 5 + 7 = 1 2 \0 ...

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 96


sprintf funkcija

Funkcija sprintf iz biblioteke stdio.h radi slino kao printf


samo to umjesto na ekran upisuje tekst u string.
char str[10];
int a=5, b=7;
sprintf(str, "%d+%d=%d", a, b, a+b);
String str sada glasi:

ta ako stavimo vee


brojeve (etverocifrene)?

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 5 + 7 = 1 2 \0 ...

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 97


sprintf funkcija

Funkcija sprintf iz biblioteke stdio.h radi slino kao printf


samo to umjesto na ekran upisuje tekst u string.
char str[40];
int a=5, b=7;
sprintf(str, "%d+%d=%d", a, b, a+b);
String str sada glasi:

ta ako stavimo vee


brojeve (etverocifrene)?

... 250 251 252 253 254 255 256 257 258 259 260 ...
... 5 + 7 = 1 2 \0 ...

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 98


sscanf funkcija

Slino i funkcija sscanf oitava vrijednosti promjenljivih iz


stringa.
char str[40];
int a=5, b=7, c, d, e;
sprintf(str, "%d+%d=%d", a, b, a+b);
sscanf(str, "%d+%d=%d", &c, &d, &e);
printf("Zbir je %d", e);

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 99


sscanf funkcija

Drugi primjer:
char recenica[] = "Mehmed ima 19 godina";
char ime[20];
int godina;
sscanf(recenica, "%s %*s %d", ime, &godina);
printf("Ime: %s, Godina: %d\n", ime, godina);

10.1.2017 Vedran Ljubovi * OR16 * P17: udnovate stvari 100

You might also like