Wat betekent int argc, char *argv[]?

In veel C++ IDE’s en compilers, wanneer het de hoofdfunctie voor je genereert, ziet het er als volgt uit:

int main(int argc, char *argv[])

Als ik C++ codeer zonder IDE, alleen met een command line compiler, typ ik:

int main()

zonder parameters. Wat betekent dit en is het essentieel voor mijn programma?


Antwoord 1, autoriteit 100%

argven argczijn hoe opdrachtregelargumenten worden doorgegeven aan main()in C en C++.

argcis het aantal strings waarnaar wordt verwezen door argv. Dit is (in de praktijk) 1 plus het aantal argumenten, aangezien vrijwel alle implementaties de naam van het programma voor de array zullen zetten.

De variabelen heten volgens afspraak argc(argumentenaantal) en argv(argumentvector), maar ze kunnen elke geldige identifier krijgen: int main(int num_args, char** arg_strings)is even geldig.

Ze kunnen ook volledig worden weggelaten, wat resulteert in int main(), als u niet van plan bent opdrachtregelargumenten te verwerken.

Probeer het volgende programma:

#include <iostream>
int main(int argc, char** argv) {
    std::cout << "Have " << argc << " arguments:" << std::endl;
    for (int i = 0; i < argc; ++i) {
        std::cout << argv[i] << std::endl;
    }
}

Het uitvoeren met ./test a1 b2 c3zal output

Have 4 arguments:
./test
a1
b2
c3

Antwoord 2, autoriteit 8%

argcis het aantal argumenten dat vanaf de opdrachtregel aan uw programma wordt doorgegeven en argvis de reeks argumenten.

Je kunt door de argumenten lopen als je weet hoeveel ze zijn, zoals:

for(int i = 0; i < argc; i++)
{
    // argv[i] is the argument at index i
}

Antwoord 3, autoriteit 3%

Stel dat u uw programma als volgt uitvoert (met behulp van de sh-syntaxis):

myprog arg1 arg2 'arg 3'

Als je je main hebt gedeclareerd als int main(int argc, char *argv[]), dan (in de meeste omgevingen), wordt je main()aangeroepen alsof als:

p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));

Als je je main echter hebt gedeclareerd als int main(), zal het zoiets worden genoemd als

exit(main());

en je krijgt de argumenten niet doorgegeven.

Twee aanvullende dingen om op te merken:

  1. Dit zijn de enige twee standaard verplichte handtekeningen voor main. Als een bepaald platform extra argumenten of een ander retourtype accepteert, dan is dat een extensie en moet er niet op worden vertrouwd in een draagbaar programma.
  2. *argv[]en **argvzijn exact gelijk, dus je kunt int main(int argc, char *argv[])als int main(int argc, char **argv).

Antwoord 4

De parameters voor mainvertegenwoordigen de opdrachtregelparameters die aan het programma werden verstrekt toen het werd gestart. De parameter argcvertegenwoordigt het aantal opdrachtregelargumenten en char *argv[]is een array van tekenreeksen (tekenaanwijzers) die de afzonderlijke argumenten op de opdrachtregel vertegenwoordigen.


Antwoord 5

int main();

Dit is een eenvoudige aangifte. Het kan geen opdrachtregelargumenten aan.

int main(int argc, char* argv[]);

Deze declaratie wordt gebruikt wanneer uw programma opdrachtregelargumenten moet aannemen. Als het zo wordt uitgevoerd:

myprogram arg1 arg2 arg3

argc, of Argument Count, wordt ingesteld op 4 (vier argumenten), en argv, of Argument Vectors, wordt gevuld met tekenreeksverwijzingen naar “myprogram” , “arg1”, “arg2” en “arg3”. De programma-aanroep (myprogram) is opgenomen in de argumenten!

U kunt ook het volgende gebruiken:

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

Dit is ook geldig.

Er is nog een parameter die u kunt toevoegen:

int main (int argc, char *argv[], char *envp[])

De parameter envpbevat ook omgevingsvariabelen. Elk item volgt dit formaat:

VARIABLENAME=VariableValue

zoals dit:

SHELL=/bin/bash    

De lijst met milieuvariabelen is null-beëindigd.

Belangrijk: Gebruik geen argvof envpwaarden rechtstreeks in oproepen naar system()! Dit is een enorm beveiligingsgat als kwaadwillende gebruikers kunnen omgevingsvariabelen in opdrachtregelopdrachten en (potentieel) massale schade veroorzaken. Gebruik in het algemeen niet system(). Er is bijna altijd een betere oplossing geïmplementeerd via C-bibliotheken.


6

De eerste parameter is het aantal verstrekte argumenten en de tweede parameter is een lijst met snaren die die argumenten vertegenwoordigen.


7

Beide

int main(int argc, char *argv[]);
int main();

zijn wettelijke definities van het invoerpunt voor een C- of C++ -programma. Stroustrup: C++ stijl en techniek FAQ Details enkele van de variaties die mogelijk zijn Juridisch voor uw hoofdfunctie.

Other episodes