Was bedeutet int argc, char *argv[] bedeuten?

Lesezeit: 7 Minuten

Was bedeutet int argc char argv bedeuten
Greg Treleaven

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

1647268814 206 Was bedeutet int argc char argv bedeuten
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


Was bedeutet int argc char argv bedeuten
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
}

1647268815 976 Was bedeutet int argc char argv bedeuten
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:

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

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:

  1. 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.
  2. *argv[] und **argv sind genau gleichwertig, also kannst du schreiben int main(int argc, char *argv[]) als int main(int argc, char **argv).

  • Wenn wir technisch sind, basic.start.main/2 erlaubt ausdrücklich implementierungsdefinierte zusätzliche Versionen von main(), sofern die Implementierung die beiden vordefinierten Versionen bereitstellt. Sie sind es also nicht exakt nicht konform. Die häufigste ist envpdie sowohl in C als auch in C++ so bekannt ist, dass es ist buchstäblich der allererste Eintrag in Abschnitt J.5 (Gemeinsame Erweiterungen) des C-Standards.

    – Justin Time – Wiedereinsetzung von Monica

    22. Januar 2017 um 22:40 Uhr


  • Danke für die nette Pedanterie @Justin. Antwort aktualisiert, um korrekter zu sein.

    – Toby Speight

    23. Januar 2017 um 12:34 Uhr

1647268815 508 Was bedeutet int argc char argv bedeuten
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.

Was bedeutet int argc char argv bedeuten
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


1647268816 231 Was bedeutet int argc char argv bedeuten
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


1647268817 301 Was bedeutet int argc char argv bedeuten
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

1001980cookie-checkWas bedeutet int argc, char *argv[] bedeuten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy