Acasă / Sistem de operare mobil / Argumente ale funcției Main(). Argumente ale funcției principale Ce înseamnă main în c

Argumente ale funcției Main(). Argumente ale funcției principale Ce înseamnă main în c

Când se creează automat o aplicație de consolă în limbajul de programare C++, se creează automat o funcție principală foarte asemănătoare cu aceasta:

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

Antetul funcției conține semnătura functia principala main() cu argumentele argс și argv.
Dacă rulați un program prin linia de comandă, atunci este posibil să transferați unele informații în acest program. Există argumente pentru asta linie de comandă argc și argv.
Parametrul argc este de tip int și conține numărul de parametri trecuți funcției principale. Mai mult decât atât, argc este întotdeauna cel puțin 1, chiar și atunci când nicio informație nu este transmisă funcției principale, deoarece primul parametru este numele aplicației.
Parametrul argv este o matrice de pointeri către șiruri. Prin linia de comandă pot fi trecute doar datele șiruri.

Când porniți un program prin linia de comandă șir WindowsÎi poți oferi câteva informații. În acest caz, linia de comandă va arăta astfel:
Drive:\cale\nume.exe argument1 argument2 ...

Argumentele liniei de comandă sunt separate prin unul sau mai multe spații.

Argumentul argv conține numele complet al aplicației:

#include
folosind namespace std;

cout<< argv << endl;

Returnează 0;
}

Rezultatul executiei

Exemplu: Calcularea produsului a două numere întregi
Programul folosește funcția pentru a converti un șir într-un număr întreg StrToInt() de aici.

#include
folosind namespace std;
int StrToInt(char *s) (...)
int main(int argc, char * argv) (

Int a = 0, b=0;

Dacă (argc > 1)

a = StrToInt(argv);

Dacă (argc > 2)

b = StrToInt(argv);

cout<< a <<«*» << b << «= « << a*b << endl;

Returnează 0;
}

Programul este lansat după cum urmează:

Rezultatul executiei

Depanarea unui program cu argumente de linie de comandă

Pentru a transmite argumente în linia de comandă atunci când depanați un program, trebuie să accesați meniul Proprietăți proiect.


Pe fila Proprietăți de configurare ->Depanare alege Argumente de comandăși stabiliți-le valorile.

Când rulați programul în modul de depanare, argumentele introduse vor fi tratate de program ca argumente în linia de comandă.

Programul minim C++ este

Int main() ( ) // programul minim C++

Acest program conține o declarație de funcție principal care nu acceptă niciun argument. Acolade reprezintă gruparea în C++ și în acest caz arată corpul unei funcții principal. Adică, începutul funcției principale este o paranteză deschisă, iar sfârșitul funcției principale este o paranteză de închidere. O bară oblică dublă indică începutul unui comentariu. Comentariile sunt ignorate de compilator și servesc la clarificarea informațiilor din cod.

Fiecare program scris în C++ are o funcție principal(), de la care pornește programul. Funcţie principal(), de regulă, returnează rezultatul executării sale, care este semnalat de int(întreg - întreg), care se scrie înaintea funcției principal(). La finalizarea corectă, cu succes, funcția principal() se întoarce ca rezultat 0 . O valoare de rezultat diferită de zero semnalează o terminare anormală a programului.

Valoarea returnată de program la finalizare poate fi utilizată în sistemul de operare în scopuri de service.

Un exemplu tipic al primului program în orice limbaj de programare este textul "Salut Lume!":

#include int main() ( std::cout<< "Hello, World!\n"; }

Dar este totul atât de simplu în acest program? În general, numai acest mic program conține un strat foarte mare de informații care trebuie înțeles că se dezvoltă în C++.

  1. Directivă #include
    #include
    spune compilatorului că este necesar să includă un anumit fișier antet, ale cărui componente sunt planificate să fie utilizate în fișierul în care este declarată funcția principal() . iostream este biblioteca standard I/O din STL. Adică, funcționalitatea bibliotecilor este deja folosită aici, deși sunt un standard pentru limbaj. Și ultimul punct sunt parantezele unghiulare în care se află numele bibliotecii, care indică faptul că aceasta este includerea fișierelor externe în proiect și nu a celor care fac parte din proiect. Aceleași fișiere care fac parte din proiect sunt incluse înconjurate de ghilimele obișnuite, de exemplu #include „clasa mea.h”. Această conexiune a bibliotecilor este standard. De exemplu, în Visual Studio Nerespectarea acestui standard va duce la erori.
  2. std este utilizarea spațiului de nume în care se află instrucțiunea de ieșire cout. Spațiile de nume au fost introduse în C++ pentru a elimina conflictele de nume dintre biblioteci și proiectul dezvoltatorului dacă există undeva nume de funcții sau clase duplicate. Java folosește un sistem de pachete pentru a rezolva conflictele de nume.

    cout este un operator de ieșire care are un operator supraîncărcat << pentru a evita utilizarea unei funcții separate pentru a trimite text în consolă.

Aceasta este în plus față de scrierea funcției principal poate lua forme diferite, deși două intrări sunt standard:

  1. int main()
  2. int main(int argc, char* argv)

De asemenea, puteți găsi înregistrări precum void main() etc. Dar acestea sunt intrări eronate, deși în unele compilatoare se vor compila, chiar și fără erori și avertismente.

În înregistrare int main(int argc, char* argv) argumentele sunt transmise:

  1. argc- indică numărul de argumente transmise. Întotdeauna cel puțin 1, deoarece numele programului este întotdeauna transmis
  2. argv- o serie de pointeri către argumente care sunt transmise ca variabile șir.

Dacă argc mai mare decât 1, înseamnă că au fost transmise argumente suplimentare la lansarea programului.

Verificarea ar putea arăta astfel:

#include int main(int argc, char* argv) ( // Dacă a fost trecut un argument suplimentar, if (argc > 1) ( // atunci vom încerca să tipărim argumentul primit std::cout<< argv<

În general, există un număr mare de puncte care trebuie înțelese în C++ chiar și pentru un program mic, dar asta doar îl face mai interesant ;-)

Posibilitățile familiei de limbaje C sunt cu adevărat nelimitate, cu toate acestea, în această libertate există și dezavantaje: programatorul trebuie să fie mereu atent și să controleze „depășirea tamponului”, astfel încât ulterior programul să nu se prăbușească într-un „ ecran albastru” pe o mulțime de versiuni diferite de Windows și hardware pentru utilizatori. Aceleași crackere și reversoare caută în mod specific vulnerabilități în codul programelor C în care poate fi plantat orice cod de virus, autorul a vorbit mai detaliat despre acest lucru în cursul său video; Am învățat multe acolo și acum codul meu este mult mai sigur.

Funcția principală.

Fiecare program C și C++ trebuie să aibă o funcție principală;<значение>și depinde de tine unde îl plasezi. Unii programatori îl plasează la începutul fișierului, alții la sfârșit. Cu toate acestea, indiferent de poziția sa, trebuie să rețineți următoarele: Argumente la funcția „principală”. #include Procedura de pornire Borland C++ trimite trei parametri (argumente) la funcția principală: argc, argv și env.<=argc; i++) printf(" argv[%d]: %s\n",i,argv[i]); printf("Среда содержит следующие строки:\n"); for (i=0; env[i] != NULL; i++) printf(" env[%d]: %s\n",i,env[i]); return 0; } Предположим, что вы запускаете программу ARGS.EXE со следующей командной строкой: C:> args first_arg „arg cu spații libere” 3 4 „pentru ultimul” oprire! Comentariu. Dacă doriți ca procesarea caracterelor de evadare să aibă loc întotdeauna, de ex. Pentru ca WILDARGS.OBJ să fie conectat automat de către editorul de linkuri, trebuie să modificați biblioteca standard C?.LIB pentru a include fișierul WILDARGS.OBJ. Pentru a face acest lucru, eliminați SETARGV din bibliotecă și adăugați WILDARGS. Acest lucru se poate face cu următoarele comenzi (presupunem că bibliotecile standard și WILDARGS.OBJ sunt conținute în directorul curent): TLIB este descris în Capitolul 7, Utilități, din Ghidul utilizatorului tlib cs -setargv +wildargs tlib cc -. setargv +wildargs tlib cm -setargv +wildargs tlib cl -setargv +wildargs tlib ch -setargv +wildargs Compilarea folosind comutatorul -p (convenția de apelare Pascal) Dacă compilați programul utilizând convenția de apelare Pascal (descrisă în detaliu în convenția de apelare Pascal Capitolul 9 „Interfața cu limbajul de asamblare”, „Ghidul programatorului”), trebuie să vă amintiți că funcția principală trebuie să fie declarată în mod explicit ca o funcție C. Acest lucru se poate face folosind cuvântul cheie cdecl: cdecl main(int argc , char *argv, char *env) Valoarea returnată de funcția principală.

- argc, un număr întreg, este numărul de argumente ale liniei de comandă trimise către funcția principală, - argv este o matrice de pointeri către șiruri de caractere (char *).

Tratez întotdeauna funcțiile C ca și cum ar fixa numărul de argumente indiferent de context, cu excepția cazului în care folosesc va_args. Adică cred că au ÎNTOTDEAUNA un prototip:

Int main(int argc, char **argv).

chiar dacă nu sunt transmise argumente, funcția are acele argumente în stivă, deoarece funcția principală nu are supraîncărcare a funcției.

C are capacitatea de a avea o supraîncărcare primitivă pretinzând pur și simplu că argumentul lipsește. În acest caz, argumentul este încă transmis și este pe stivă, dar nu îl accesați niciodată, așa că doar reduce dimensiunea codului sursă.

A spune int main() înseamnă pur și simplu că știu că funcția poate avea parametri, dar nu îi folosesc, așa că scriu int main().

Declarația int main (void) spune că main SCENELY nu are argumente și implică că există două prototipuri diferite de funcție:

Int main(void); int main(int argc, char **argv);

Deoarece C nu are o funcție de supraîncărcare, acest lucru este oarecum înșelător pentru mine și nu am încredere în codul cu un gol în el. Nu aș face decât dacă main nu a acceptat NICIODATĂ niciun parametru, caz în care main(void) ar fi complet bine.

NOTA. Unele implementări au mai mulți parametri în principal decât argc și argv ca env, dar asta nu mă deranjează pentru că știu că nu spun direct că aceștia sunt doar doi parametri, dar aceștia sunt parametrii minimi și totul este în regulă să ai mai mult, dar nu mai puțin. Acest lucru contrazice declarația directă a lui int main(void) care țipă la mine deoarece ACEASTA FUNCȚIE NU ARE PARAMETRI, ceea ce nu este adevărat, deoarece este, pur și simplu sunt omise.

Iată codul meu de bază:

/* sample.c - construiți în eșantion. */ #include int main(void) ( int _argc = *((int *)2686800); char ***_pargv = (char ***)2686804; int i; for (i = 1; i< _argc; ++i) { printf("%s ", (*_pargv)[i]); } return 0; }

./sample Am clar argumente

Funcția are în mod clar argumente transmise, chiar dacă nu spune în mod explicit că nu introduce void în prototipul funcției.

După cum s-a menționat mai sus:

(6.7.6.3p10) Un caz special al unui parametru nenumit de tip void de îndată ce un element din listă indică faptul că funcția nu are parametri.

Deci, a spune că o funcție are void ca argument, dar de fapt a avea argumente pe stivă este o contradicție.

Ideea mea este că argumentele încă există, așa că a spune în mod explicit că principalul nu conține argumente este necinstit. O modalitate corectă ar fi să spunem int main(), care nu afirmă nimic despre câți parametri are, ci doar de câți parametri aveți nevoie.

NOTĂ 2: _argc, _pargv sunt dependente de sistem pentru a găsi valorile pe care ar trebui să le găsiți rulând acest program:

/* findargs.c */ #include int main(int argc, char **argv) ( printf("adresa argc este %u.\n", &argc); printf("adresa argv este %u.\n", &argv); return 0; )

Aceste valori ar trebui să rămână corecte pentru sistemul dumneavoastră specific.

Borland C++ acceptă trei argumente pentru main(). Primele două sunt tradiționalele argc și argv. Acestea sunt singurele argumente pentru main() definite de standardul ANSI C. Ele permit transmiterea argumentelor din linia de comandă către program. Argumentele liniei de comandă sunt informațiile care urmează numele programului pe linia de comandă a sistemului de operare. De exemplu, atunci când un program este compilat folosind compilatorul de linie Borland, acesta este de obicei tastat bcc nume_program

Unde nume_program este un program care trebuie compilat. Numele programului este transmis compilatorului ca argument.

Parametrul argc conține numărul de argumente ale liniei de comandă și este un număr întreg. Este întotdeauna egal cu cel puțin 1, deoarece numele programului se califică drept primul argument. Parametrul argv este un pointer către o matrice de pointeri de caractere. Fiecare element al acestui tablou indică un argument de linie de comandă. Toate argumentele liniei de comandă sunt șiruri. Toate numerele sunt convertite de program în format intern. Următorul program afișează „Bună ziua” urmat de numele de utilizator când este introdus direct după numele programului:

#include

{
if(argc!=2)
{
printf("Ai uitat sa-ti introduci numele\n");
întoarcere 1;
}
printf("Bună ziua %s", argv);
returnează 0;
}

Dacă apelați numele acestui program și numele de utilizator este Sergey, atunci pentru a porni programul ar trebui să tastați:
numele Serghei.
Ca rezultat al programului, vor apărea următoarele:
— Bună, Serghei.

Argumentele liniei de comandă trebuie separate prin spații sau file. Virgulele, punctele și virgulă și caracterele similare nu sunt considerate delimitatori. De exemplu:

Constă din trei rânduri, în timp ce

Herb, Rick, Fred

Aceasta este o singură linie - virgulele nu sunt delimitătoare.

Dacă trebuie să treceți un șir care conține spații sau tab-uri ca un singur argument, trebuie să-l încadrați între ghilimele duble. De exemplu, acesta este un argument:

"acesta este un test"

Este important să declarați corect argv. Cea mai tipică metodă este:

Parantezele goale indică faptul că tabloul nu are o lungime fixă. Puteți accesa elemente individuale folosind indexarea argv. De exemplu, argv indică către prima linie, care conține întotdeauna numele programului. argv indică la următoarea linie și așa mai departe.

Mai jos este un mic exemplu de utilizare a argumentelor din linia de comandă. Numărătoarea inversă de la valoarea specificată pe linia de comandă și emite un semnal când ajunge la zero. Rețineți că primul argument conține un număr convertit într-un număr întreg folosind funcția standard atoi(). Dacă șirul „display” este prezent ca al doilea argument, atunci contorul însuși va fi afișat pe ecran.

/* program de numărare */

#include
#include
#include
int main(int argc, char *argv)
{
int disp, numărare;
dacă (argc<2)
{
printf("Trebuie să introduceți lungimea numărării\n");
printf("pe linia de comandă. Încercați din nou.\n");
întoarcere 1;
}
if (argc==3 && !strcmp(argv,"display")) disp = 1;
else disp = 0;
for(count=atoi(argv); count; -count)
if (disp) printf("%d", count);
printf("%c", "\a"); /* pe majoritatea computerelor, acesta este un apel */
returnează 0;
}

Vă rugăm să rețineți că, dacă nu sunt specificate argumente, apare un mesaj de eroare. Acest lucru este cel mai tipic pentru programele care folosesc argumente de linie de comandă pentru a emite instrucțiuni dacă s-a încercat să ruleze programul fără informațiile corecte.

Pentru a accesa caractere individuale ale liniei de comandă, adăugați un al doilea index la argv. De exemplu, următorul program imprimă toate argumentele cu care a fost apelat, câte un caracter:

#include
int main(int argc, char *argv)
{
int t, i;
pentru(t=0; t {
i = 0;
în timp ce(argv[t][i])
{
printf("%c", argv[t][i]);
}
printf(" ");
}
returnează 0;
}

Trebuie să ne amintim că primul index este pentru accesarea unui șir, iar al doilea este pentru accesarea unui caracter dintr-un șir.

De obicei, argc și argv sunt folosite pentru a obține comenzi sursă. Teoretic este posibil să aveți până la 32767 de argumente, dar majoritatea sistemelor de operare nici măcar nu vă permit să vă apropiați de asta. De obicei, aceste argumente sunt folosite pentru a specifica un nume de fișier sau opțiuni. Utilizarea argumentelor din linia de comandă oferă programului un aspect profesional și permite programului să fie utilizat în fișiere batch.

Dacă includeți fișierul WILDARGS.OBJ furnizat cu Borland C++, puteți utiliza șabloane în argumente de tip *.EXE. (Borland C++ gestionează automat metacaracterele și incrementează argc în consecință.) De exemplu, dacă conectați WILDARGS.OBJ la următorul program, acesta vă va spune câte fișiere se potrivesc cu numele fișierului specificat în linia de comandă:

/* Conectați acest program cu WILDARGS.OBJ */

#include
int main(int argc, char *argv)
{
înregistrare int i;
printf("%d fișiere se potrivesc cu numele specificat\n", argc-1);
printf("Sunt: ");
pentru (i=1; i printf("%s", argv[i]);
returnează 0;
}

Dacă numim acest program WA, apoi îl rulăm după cum urmează, vom obține numărul de fișiere cu extensia EXE și o listă cu numele acestor fișiere:

Pe lângă argc și argv, Borland C++ oferă și un al treilea argument de linie de comandă -env. Parametrul env permite unui program să acceseze informații despre mediul sistemului de operare. Parametrul env trebuie să urmeze argc și argv și este declarat după cum urmează:

După cum puteți vedea, env este declarat în același mod ca argv. La fel ca argv, este un pointer către o matrice de șiruri. Fiecare linie este un șir de mediu definit de sistemul de operare. Parametrul env nu are un parametru argc echivalent care să spună câte rânduri de mediu există. În schimb, ultima linie a mediului este nulă. Următorul program imprimă toate șirurile de mediu definite în prezent în sistemul de operare:

/* acest program afișează toate liniile de mediu */

#include
int main(int argc, char *argv, char *env)
{
int;
for(t=0; env[t]/t++)
printf("%s\n", env[t]);
returnează 0;
}

Vă rugăm să rețineți că, deși argc și argv nu sunt folosite de program, ele trebuie să fie prezente în lista de parametri. C nu cunoaște numele parametrilor. În schimb, utilizarea lor este determinată de ordinea în care sunt declarați parametrii. De fapt, puteți apela parametrul cum doriți. Deoarece argc, argv și env sunt nume tradiționale, cel mai bine este să le folosiți în continuare, astfel încât oricine citește programul să poată înțelege instantaneu că acestea sunt argumente pentru funcția main().

O sarcină tipică pentru programe este să caute o valoare definită într-un șir de mediu. De exemplu, conținutul liniei PATH permite programelor să utilizeze căi de căutare. Următorul program demonstrează cum să găsiți șiruri de caractere care declară căi de căutare standard. Utilizează funcția standard de bibliotecă strstr(), care are următorul prototip:

Char *strstr(const char *str1, const char *str2);

Funcția strstr() caută șirul indicat de str1 în șirul indicat de str2. Dacă se găsește un astfel de șir, este returnat un pointer către prima poziție. Dacă nu se găsesc potriviri, funcția returnează NULL.

/* programul caută printre șirurile de mediu o linie care conține PATH */

#include
#include
int main (int argc, char *argv, char *env)
{
int;
pentru(t=0; env[t]; t++)
{
if(strstr(env[t], „CALEA”))
printf("%s\n", env[t]);
}
returnează 0;
}