In vielen C ++ - IDEs und Compilern sieht es folgendermaßen aus, wenn die Hauptfunktion für Sie generiert wird:
int main(int argc, char *argv[])
Wenn ich C ++ ohne IDE nur mit einem Befehlszeilen-Compiler codiere, gebe ich Folgendes ein:
int main()
ohne Parameter. Was bedeutet das und ist es für mein Programm von entscheidender Bedeutung?
c++
parameters
command-line-arguments
argv
argc
Greg Treleaven
quelle
quelle
int main(int argc, char* argv[], char* envp[])
, das letzte Argument zu deklarieren und auszudrucken.;)
system()
Aufrufe, DB-Abfragen usw. Wie bei Benutzereingaben üblich.char **envp
Argumenten keine fehlerhaften Zeichenfolgen, Datenbankabfragen usw. übergeben müssen ?Antworten:
argv
undargc
wie Befehlszeilenargumentemain()
in C und C ++ übergeben werden.argc
wird die Anzahl der Zeichenfolgen sein, auf die durch gezeigt wirdargv
. Dies ist (in der Praxis) 1 plus die Anzahl der Argumente, da praktisch alle Implementierungen dem Array den Namen des Programms voranstellen.Die Variablen werden gemäß Konvention
argc
( Argumentanzahl ) undargv
( Argumentvektor ) benannt, können jedoch mit jedem gültigen Bezeichner versehen werden:int main(int num_args, char** arg_strings)
ist gleichermaßen gültig.Sie können auch ganz weggelassen werden
int main()
, wenn Sie keine Befehlszeilenargumente verarbeiten möchten.Versuchen Sie das folgende Programm:
Wenn Sie es mit ausführen,
./test a1 b2 c3
wird ausgegebenquelle
argc
kann 0 sein, in diesem Fallargv
kann NULL sein. Es ist von der Standard-AFAIK erlaubt. Ich habe noch nie von einem System gehört, das dies in der Praxis tut, aber es könnte sicherlich existieren und würde keine Standards verletzen.argv[argc]
soll 0 sein" (C ++ 03 §3.6.1 / 2),argv
kann nicht null sein.*NULL
ist definitiv nicht gleichNULL
.argc
ist die Anzahl der Argumente, die über die Befehlszeile an Ihr Programm übergeben werden, undargv
das Array der Argumente.Sie können die Argumente durchlaufen, indem Sie die Anzahl der Argumente kennen:
quelle
Angenommen, Sie führen Ihr Programm folgendermaßen aus (unter Verwendung der
sh
Syntax):Wenn Sie Ihre Hauptleitung als deklariert haben, wird Ihre
int main(int argc, char *argv[])
(in den meisten Umgebungen)main()
wie folgt aufgerufen:Wenn Sie jedoch Ihr Haupt als deklariert haben
int main()
, wird es so etwas wie genanntund Sie bekommen die Argumente nicht übergeben.
Zwei zusätzliche Dinge zu beachten:
main
. Wenn eine bestimmte Plattform zusätzliche Argumente oder einen anderen Rückgabetyp akzeptiert, ist dies eine Erweiterung und sollte in einem portablen Programm nicht verwendet werden.*argv[]
und**argv
sind genau gleichwertig, so dass Sie schreiben könnenint main(int argc, char *argv[])
alsint main(int argc, char **argv)
.quelle
basic.start.main/2
explizit implementierungsdefinierte Zusatzversionen von zugelassenmain()
, sofern die Implementierung die beiden vordefinierten Versionen bereitstellt. Sie sind also nicht gerade nicht konform. Die häufigste ist dieenvp
, die sowohl in C als auch in C ++ so bekannt ist , dass sie buchstäblich der allererste Eintrag in Abschnitt J.5 (Allgemeine Erweiterungen) des C-Standards ist .Die Parameter zur
main
Darstellung der Befehlszeilenparameter, die dem Programm beim Start zur Verfügung gestellt wurden. Derargc
Parameter stellt die Anzahl der Befehlszeilenargumente dar undchar *argv[]
ist ein Array von Zeichenfolgen (Zeichenzeigern), die die einzelnen Argumente in der Befehlszeile darstellen.quelle
argv[0]
ist das, was das Programm, das das C-Programm startet, als gegeben hatargv[0]
. Im Fall von Bash ist es oft (vielleicht immer) der Pfadname der ausführbaren Datei, aber Bash ist nicht das einzige Programm, das andere Programme ausführt. Es ist zulässig, wenn auch exzentrisch, Folgendes zu verwenden :char *args[] = { "cat", "/dev/null", "/etc/passwd", 0 }; execv("/bin/ls", args);
. Auf vielen Systemen wird der Wert vom Programm so gesehen, wie er seinargv[0]
wirdcat
, obwohl die ausführbare Datei ist/bin/ls
.Die
main
Funktion kann zwei Parameter haben,argc
undargv
.argc
ist ein integer (int
) -Parameter und die Anzahl der an das Programm übergebenen Argumente.Der Programmname ist immer das erste Argument, daher gibt es mindestens ein Argument für ein Programm und der Mindestwert von
argc
ist eins. Wenn ein Programm selbst zwei Argumente hat, ist der Wert vonargc
drei.Der Parameter
argv
zeigt auf ein String-Array und wird als Argumentvektor bezeichnet . Es ist ein eindimensionales String-Array von Funktionsargumenten.quelle
Dies ist eine einfache Erklärung. Es können keine Befehlszeilenargumente akzeptiert werden.
Diese Deklaration wird verwendet, wenn Ihr Programm Befehlszeilenargumente annehmen muss. Wenn Sie so laufen:
argc
, oder Argument Count wird auf 4 (vier Argumente) gesetzt, undargv
oder Argument Vectors werden mit Zeichenfolgenzeigern auf "myprogram", "arg1", "arg2" und "arg3" gefüllt. Der Programmaufruf (myprogram
) ist in den Argumenten enthalten!Alternativ können Sie Folgendes verwenden:
Dies gilt auch.
Es gibt einen weiteren Parameter, den Sie hinzufügen können:
Der
envp
Parameter enthält auch Umgebungsvariablen. Jeder Eintrag folgt diesem Format:so was:
Die Liste der Umgebungsvariablen ist nullterminiert.
WICHTIG: Verwenden Sie KEINE
argv
oderenvp
Werte direkt in Aufrufen vonsystem()
! Dies ist eine große Sicherheitslücke, da böswillige Benutzer Umgebungsvariablen auf Befehlszeilenbefehle setzen und (möglicherweise) massiven Schaden anrichten können. Im Allgemeinen nur nicht verwendensystem()
. Es gibt fast immer eine bessere Lösung, die durch C-Bibliotheken implementiert wird.quelle
Der erste Parameter ist die Anzahl der bereitgestellten Argumente und der zweite Parameter ist eine Liste von Zeichenfolgen, die diese Argumente darstellen.
quelle
Beide von
sind rechtliche Definitionen des Einstiegspunkts für ein C- oder C ++ - Programm. Stroustrup: In den häufig gestellten Fragen zu Stil und Technik von C ++ werden einige der Variationen aufgeführt, die für Ihre Hauptfunktion möglich oder zulässig sind.
quelle
int main()
== ==>int main(void)
... für Kompatibilität und Lesbarkeit ungültig machen . Ich weiß nicht, ob alle älteren Versionen von C zulassen, dass void-Funktionen eine leere Parameterliste in der Deklaration haben.void
erforderlich ist. Zitiere mich nicht dazu und ich weiß jetzt, dass es ein etwas dummer Kommentar ist. Es kann aber nicht schaden.