nav_dugme codeBlog codeBlog
  • početna Početna stranica
  • Sačuvani članci Sačuvani članci
  • Članci
     (spisak)
  • Kontakt
Povratak na vrh stranice

Info & povezani članci Info o članku - dugme

Info

trejler_sat Datum objave: 20.03.2020.

trejler_dokument Jezici: C

trejler_teg_narandzasti Težina: 7/10

C
C++
komandna linija
argc
argv
niske
teorija
zanimljivosti

Povezani članci

Operacije sa tekstualnim datotekama u programskim jezicima C i PythonOperacije sa bitovima u programskom jeziku CPostfiksna notacija - kako računari računaju?Klase složenosti algoritama (O notacija)Regularni izrazi - napredna pretraga tekstaIzuzeci u programiranjuUvod u PythonŠablonske niske u programskim jezicimaIzbor prvog programskog jezikaASCII, Unicode i UTF - Predstavljanje znakova na računarimaUNIX Time - Predstavljanje datuma i vremena na računarimaKako napraviti syntax highlighter
Svi članci
For a successful technology, reality must take precedence over public relations, for nature cannot be fooled.
Richard Feynman

Argumenti komandne linije

Facebook LinkedIn Twitter Viber WhatsApp E-mail
zoom_plus zoom_minus bookmark
početna > Članci > Teorija

Uvod

Pri otvaranju nove izvorne datoteke u popularnim integrisanim razvojnim okruženjima kao što su npr. Dev-C++ ili Code::Blocks, može se zapaziti sledeći programski kod (koji se tipično generiše automatski, ali, može se naravno upisati i 'ručno'):

		
int main(int argc, char** argv) {

	return 0;
}
		
	
Slika 1. - Funkcija main, u obliku u kome se tipično pojavljuje pri pokretanju novog projekta u razvojnim okruženjima kao što su Dev-C++ i Code::Blocks.

Prikazana struktura 'prazne' funkcije main ponešto je kompleksnija u odnosu na jednostavne primere kakvi se sreću u udžbenicima programiranja (u uvodnim poglavljima), i stoga se mnogi mlađi programeri često pitaju čemu služe parametri argc i argv?

Navedeni parametri nisu 'skroz trivijalni' za razumevanje (pogotovo na samom početku bavljenja programiranjem), ali, nema ni "prevelike misterije":

  • parametar argc (argument count) predstavlja broj argumenata koji su predati preko komandne linije operativnog sistema
  • parametar **argv (argument vector) je pokazivač na niz stringova koji se učitava

Predavanje argumenata preko komandne linije nije tipična operacija u operativnim sistemima sa GUI okruženjem, kao što je Windows (za razliku od, recimo, Linux-a i srodnih operativnih sistema, na kojima je rad "u konzoli" i dalje veoma zastupljen), ali, opcija za predavanje argumenata preko konzole postoji u svim operativnim sistemima koje smo pomenuli - i veoma dobro dođe.

U svakom slučaju, osvrnućemo se na 'tehnikalije' ....

Prosleđivanje argumenata preko komandne linije

Da bismo razumeli kako funkcioniše predavanje, prijem i obrada argumenata, napisaćemo jednostavan program koji sabira dva uneta broja (a da bismo se što više usmerili na glavnu temu, neće biti provere ulaznih podataka).

Izvornoj datoteci daćemo naziv sabiranje.cpp i unećemo u datoteku sledeći sadržaj:

		
#include<iostream>
#include<sstream>

using namespace std;

int main(int argc, char** argv)
{
	int a, b;
	
	if (argc == 3) {
		stringstream(argv[1]) >> a;
		stringstream(argv[2]) >> b;
		
		cout << "Zbir unetih brojeva je: ";
		cout << a + b << endl;
	}
	else {
		cout << "Argumenti nisu predati pravilno."
		cout << endl;
	}
				
	return 0;
}
		
	
Slika 2. - Program koji koristi argumente komandne linije (pri pokretanju programa, očekuje se da korisnik preda: naziva izvršne datoteke i dve niske koje predstavljaju celobrojne vrednosti).

Nakon kompajliranja, program se (ovoga puta) mora pokrenuti preko komandne linije operativnog sistema, * zadavanjem sledeće komande ....

		
sabiranje 10 12
		
	
Slika 3. - Pozivanje programa 'sabiranje' preko komandne linije: navodi se naziv programa i dva celobrojna argumenta (ekstenzija *.exe se može izostaviti).

.... pri čemu pokretanje programa proizvodi sledeći ispis:

		
Zbir unetih brojeva je: 22
		
	
Slika 4. - Rezultat izvršavanja prethodnog poziva.

* Smatraćemo da čitaoci umeju da pokrenu terminal u OS-u koji koriste.

Takođe, napomenimo da nije obavezno (tipičan primer odstupanja od pravila koje ćemo navesti je kompajler GCC), ali - budući da izvorna datoteka nosi naziv sabiranje.cpp, izvršna datoteka koja nastaje posle kompajliranja, najverovatnije će nositi naziv sabiranje.exe (bar je tako prema podrazumevanim podešavanjima, ali, naziv izlazne datoteke uvek možete izmeniti tj. podesiti prema sopstvenim potrebama) ....

Dakle, ako su preko komandne linije uredno predati argumenti (i ako su argumenti uredno primljeni i obrađeni), na kraju se dobija očekivani rezultat.

Detaljnija analiza

Razmotrićemo podrobnije neke od naredbi (objašnjenja su u komentarima):

		
// Pri pozivu "sabiranje 10 12",
// operativni sistem predaje
// programu tri argumenta:
// sam naziv izvršne datoteke,
// i dva broja (koji su zapisani
// kao nizovi znakova i razdvojeni
// razmacima), i upravo zato je
// potrebno proveriti da li
// promenljiva argc ima vrednost 3.

if (argc == 3)

// Argumentima se može pristupiti
// preko niza (koji se puni automatski).
// Elementi niza su:

argv[0] sa vrednošću "saberi"
argv[1] sa vrednošću "10"
argv[2] sa vrednošću "12"

// Pošto koristimo C++, jezik u kome je
// vođenje računa o tipovima podataka -
// obaveza programera (a ne "nešto što se
// dešava automatski"), neophodno je
// konvertovati poslednje dve niske u
// celobrojne vrednosti, za šta možemo
// koristiti klasu stringstream
// (u pitanju je svojevrstan "'cin' koji
// koristi već postojeće stringove"
// (umesto teksta koji je predat
// preko konzole)).

stringstream(argv[1]) >> a;
stringstream(argv[2]) >> b;
		
	
Slika 5. - Detaljno objašnjenje pojedinih delova programskog koda.

Predavanje argumenata je nedvosmisleno korisna opcija (koja npr. dobro dođe kada pišemo skripte u okviru operativnog sistema i želimo da se dodatni argumenti prosleđuju programima preko konzole), i svakako ćemo se predavanjem argumenata preko konzole (tj. terminala), dodatno baviti i u budućim člancima, ali, upoznaćemo se uskoro i sa tzv. protočnom obradom podataka (a u doglednoj budućnosti prikazaćemo i jednostavnu implementaciju mehanizama za protočnu obradu podataka) ....

Autor članka Nikola Vukićević Za web portal codeblog.rs
Napomena: Tekstovi, slike, web aplikacije i svi ostali sadržaji na sajtu codeblog.rs (osim u slučajevima gde je drugačije navedeno) predstavljaju intelektualnu svojinu autora sajta codeblog.rs i zabranjeno je njihovo korišćenje na drugim sajtovima i štampanim medijima, kao i bilo kakvo drugo korišćenje u komercijalne svrhe, bez eksplicitnog pismenog odobrenja autora.
© 2020-2026. Sva prava zadržana.
Facebook LinkedIn Twitter Viber WhatsApp E-mail
početna > Članci > Argumenti komandne linije
codeBlog codeBlog
Sajt posvećen popularizaciji kulture i veštine programiranja.
Napomena: Tekstovi i slike na sajtu codeblog.rs (osim u slučajevima, gde je drugačije navedeno) predstavljaju intelektualnu svojinu autora sajta codeblog.rs i zabranjeno je njihovo korišćenje na drugim sajtovima i štampanim medijima, kao i bilo kakvo drugo korišćenje u komercijalne svrhe, bez eksplicitnog odobrenja autora.
© 2020-2026. Sva prava zadržana.
Facebook - logo
Instagram - logo
LinkedIn - logo
Twitter - logo
E-mail
Naslovna
   •
Uslovi korišćenja
   •
Obaveštenja
   •
FAQ
   •
Kontakt