In vielen C++ IDEs und Compilern sieht es so aus, wenn es die Hauptfunktion für Sie generiert:
int main(int argc, char *argv[])
Wenn ich C++ ohne IDE codiere, nur mit einem Befehlszeilencompiler, gebe ich Folgendes ein:
int main()
ohne Parameter. Was bedeutet das und ist es wichtig für mein Programm?
Wenn Ihr Programm Befehlszeilenargumente ignoriert, ist das, was Sie schreiben, in Ordnung. Wenn Ihr Programm Befehlszeilenargumente verarbeiten muss, macht die IDE das richtig.
– Jonathan Leffler
11. Juni 2010 um 15:57 Uhr
Ein Tipp für Hacker: Versuchen Sie es mit der Deklaration int main(int argc, char* argv[], char* envp[]) und das letzte Argument ausgeben. ;)
– ulidtko
5. Oktober 2015 um 11:17 Uhr
@ulidtko es ist nicht gut, dass Sie Neulingen beibringen, Schwachstellen in ihre Programme einzuführen;)
– Gab是好人
27. April 2016 um 12:29 Uhr
@Gab wie führt das einfache Drucken von Umgebungsvariablen zu einer Schwachstelle? Übergeben Sie die verdorbenen Zeichenfolgen einfach nicht wörtlich an system() Aufrufe, DB-Abfragen, etc. Wie gewohnt mit Benutzereingaben.
– ulidtko
28. April 2016 um 11:42 Uhr
@ulidtko Interessant .. Können Sie erklären, warum Sie bei der Verwendung keine verdorbenen Zeichenfolgen, DB-Abfragen usw. übergeben müssen char **envp Streit?
– Meister James
11. Juni 2018 um 8:16 Uhr
mager
argv und argc werden Befehlszeilenargumente übergeben main() in C und C++.
argc wird die Anzahl der Zeichenfolgen sein, auf die gezeigt wird argv. Dies ist (in der Praxis) 1 plus die Anzahl der Argumente, da praktisch alle Implementierungen den Namen des Programms dem Array voranstellen.
Die Variablen werden benannt argc (Argument zählen) und argv (Argumentvektor) per Konvention, aber ihnen kann jeder gültige Bezeichner gegeben werden: int main(int num_args, char** arg_strings) ist gleichermaßen gültig.
Sie können auch ganz weggelassen werden, was nachgibt int main()wenn Sie keine Befehlszeilenargumente verarbeiten möchten.
Versuchen Sie folgendes Programm:
#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;
}
}
Läuft damit ./test a1 b2 c3 wird ausgegeben
Have 4 arguments:
./test
a1
b2
c3
@Chuck: Da “Der Wert von argv[argc] soll 0 sein” (C++03 §3.6.1/2), argv kann nicht Null sein.
– James McNellis
11. Juni 2010 um 16:22 Uhr
@Chuck: C (mindestens C99) hat die gleiche Anforderung.
– James McNellis
11. Juni 2010 um 23:35 Uhr
Ich dachte, ich sollte hinzufügen, dass dies in den meisten Systemen da draußen dasselbe ist, obwohl sie manchmal abstrahiert sind. In Pascal/Delphi/Lazarus erhalten Sie beispielsweise; ParamStr und ParamCount (wenn ich mich recht erinnere). Mein Punkt ist, wenn Sie (wenn überhaupt) native Anwendungen in anderen Sprachen/Osen schreiben, besteht eine gute Chance, dass die oben genannten für Sie definiert sind, und sie funktionieren in allen Systemen, die dies unterstützen, perfekt gleich (Zähler/String-Liste). Ihnen.
– Christian
8. Oktober 2010 um 15:59 Uhr
@EmilVikström Nein, das ist ein schwerwiegender Fehler, der wahrscheinlich zu einem Segfault führt. *NULL ist definitiv nicht gleich NULL.
– mager ♦
12. Januar 2014 um 1:42 Uhr
In Ordnung. So auch std::cout << "Have " << argc << " arguments:" << std::endl; im Wesentlichen bedeuten: an die Standardausgabe den String “Have” senden, dann den Integer argc senden, dann den String “arguments:” senden, dann do Das Dinge, die einen Zeilenumbruch beinhalten und andere Dinge, die ich noch nicht herausgefunden habe?
– Kobold GEGANGEN
14. Januar 2019 um 14:24 Uhr
Johannes Böker
argc ist die Anzahl der Argumente, die von der Befehlszeile an Ihr Programm übergeben werden und argv ist das Array von Argumenten.
Sie können die Argumente durchlaufen, wenn Sie deren Anzahl kennen:
for(int i = 0; i < argc; i++)
{
// argv[i] is the argument at index i
}
Toby Speight
Angenommen, Sie führen Ihr Programm so aus (mit sh Syntax):
myprog arg1 arg2 'arg 3'
Wenn Sie Ihr Haupt als deklariert haben int main(int argc, char *argv[])dann (in den meisten Umgebungen) Ihre main() wird wie folgt aufgerufen:
Wenn Sie jedoch Ihr Haupt als deklariert haben int main()es wird so etwas wie genannt werden
exit(main());
und Sie bekommen die Argumente nicht übergeben.
Zwei zusätzliche Dinge zu beachten:
Dies sind die einzigen zwei standardmäßig vorgeschriebenen Signaturen für main. Wenn eine bestimmte Plattform zusätzliche Argumente oder einen anderen Rückgabetyp akzeptiert, dann ist das eine Erweiterung, auf die man sich in einem portablen Programm nicht verlassen sollte.
*argv[] und **argv sind genau gleichwertig, also kannst du schreiben int main(int argc, char *argv[]) als int main(int argc, char **argv).
Danke für die nette Pedanterie @Justin. Antwort aktualisiert, um korrekter zu sein.
– Toby Speight
23. Januar 2017 um 12:34 Uhr
Adrian
int main();
Dies ist eine einfache Erklärung. Es kann keine Befehlszeilenargumente annehmen.
int main(int argc, char* argv[]);
Diese Deklaration wird verwendet, wenn Ihr Programm Befehlszeilenargumente annehmen muss. Wenn es so läuft:
myprogram arg1 arg2 arg3
argcoder Argument Count, wird auf 4 (vier Argumente) gesetzt, und argvoder Argumentvektoren, werden mit String-Zeigern auf „myprogram“, „arg1“, „arg2“ und „arg3“ gefüllt. Der Programmaufruf (myprogram) ist in den Argumenten enthalten!
Alternativ können Sie Folgendes verwenden:
int main(int argc, char** argv);
Dies gilt auch.
Es gibt einen weiteren Parameter, den Sie hinzufügen können:
int main (int argc, char *argv[], char *envp[])
Die envp Parameter enthält auch Umgebungsvariablen. Jeder Eintrag folgt diesem Format:
VARIABLENAME=VariableValue
so was:
SHELL=/bin/bash
Die Liste der Umgebungsvariablen ist nullterminiert.
WICHTIG: Verwenden Sie KEINE argv oder envp Werte direkt in Aufrufen an system()! Das ist ein enorm Sicherheitslücke, da böswillige Benutzer Umgebungsvariablen auf Befehlszeilenbefehle setzen und (möglicherweise) massiven Schaden anrichten könnten. Im Allgemeinen einfach nicht verwenden system(). Es gibt fast immer eine bessere Lösung, die durch C-Bibliotheken implementiert wird.
BlueMonkMN
Die Parameter zu main stellen die Befehlszeilenparameter dar, die dem Programm beim Start bereitgestellt wurden. Die argc Parameter repräsentiert die Anzahl der Befehlszeilenargumente und char *argv[] ist ein Array von Zeichenfolgen (Zeichenzeigern), die die einzelnen Argumente darstellen, die auf der Befehlszeile bereitgestellt werden.
Argv[] hat immer argv[arg] als Nullzeiger. und Argv[0] ist immer der (vollständige Pfad)/executableName als nullterminierter String
– Benutzer3629249
21. Dezember 2014 um 8:09 Uhr
@ user3629249: Nicht unbedingt; argv[0] ist, was auch immer das Programm, das das C-Programm startet, als gegeben hat argv[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, zu verwenden: char *args[] = { "cat", "/dev/null", "/etc/passwd", 0 }; execv("/bin/ls", args);. Auf vielen Systemen wird der Wert vom Programm als angezeigt argv[0] wird sein catobwohl die ausführbare Datei ist /bin/ls.
– Jonathan Leffler
5. Februar 2016 um 3:36 Uhr
Azeem
Die main Funktion kann zwei Parameter haben, argc und argv. argc ist eine ganze Zahl (int) Parameter, und es ist die Anzahl der Argumente, die an das Programm übergeben werden.
Der Programmname ist immer das erste Argument, daher gibt es mindestens ein Argument für ein Programm und den Mindestwert von argc wird einer sein. Aber wenn ein Programm selbst zwei Argumente hat deren Wert argc wird drei sein.
Parameter argv zeigt auf ein String-Array und heißt the Argumentvektor. Es ist ein eindimensionales String-Array von Funktionsargumenten.
Argv[] hat immer argv[arg] als Nullzeiger. und Argv[0] ist immer der (vollständige Pfad)/executableName als nullterminierter String
– Benutzer3629249
21. Dezember 2014 um 8:09 Uhr
@ user3629249: Nicht unbedingt; argv[0] ist, was auch immer das Programm, das das C-Programm startet, als gegeben hat argv[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, zu verwenden: char *args[] = { "cat", "/dev/null", "/etc/passwd", 0 }; execv("/bin/ls", args);. Auf vielen Systemen wird der Wert vom Programm als angezeigt argv[0] wird sein catobwohl die ausführbare Datei ist /bin/ls.
– Jonathan Leffler
5. Februar 2016 um 3:36 Uhr
Nick Gerakines
Der erste Parameter ist die Anzahl der bereitgestellten Argumente und der zweite Parameter ist eine Liste von Zeichenfolgen, die diese Argumente darstellen.
der erste Eintrag in argv[0] ist der Programmname, kein Argument
– Benutzer3629249
21. Dezember 2014 um 8:10 Uhr
@user3629249 Programmname mit Programmpfad. 😉
– Meister James
20. Juli 2018 um 8:10 Uhr
10019800cookie-checkWas bedeutet int argc, char *argv[] bedeuten?yes
Wenn Ihr Programm Befehlszeilenargumente ignoriert, ist das, was Sie schreiben, in Ordnung. Wenn Ihr Programm Befehlszeilenargumente verarbeiten muss, macht die IDE das richtig.
– Jonathan Leffler
11. Juni 2010 um 15:57 Uhr
Ein Tipp für Hacker: Versuchen Sie es mit der Deklaration
int main(int argc, char* argv[], char* envp[])
und das letzte Argument ausgeben.;)
– ulidtko
5. Oktober 2015 um 11:17 Uhr
@ulidtko es ist nicht gut, dass Sie Neulingen beibringen, Schwachstellen in ihre Programme einzuführen;)
– Gab是好人
27. April 2016 um 12:29 Uhr
@Gab wie führt das einfache Drucken von Umgebungsvariablen zu einer Schwachstelle? Übergeben Sie die verdorbenen Zeichenfolgen einfach nicht wörtlich an
system()
Aufrufe, DB-Abfragen, etc. Wie gewohnt mit Benutzereingaben.– ulidtko
28. April 2016 um 11:42 Uhr
@ulidtko Interessant .. Können Sie erklären, warum Sie bei der Verwendung keine verdorbenen Zeichenfolgen, DB-Abfragen usw. übergeben müssen
char **envp
Streit?– Meister James
11. Juni 2018 um 8:16 Uhr