Bezüglich ‘main(int argc, char *argv[])’ [duplicate]

Lesezeit: 7 Minuten

Mögliche Duplikate:

Wofür sind die Argumente von main()?
Was bedeutet int argc, char *argv[] bedeuten?

Jedes Programm beginnt mit dem main(int argc, char *argv[]) Definition.

Ich verstehe nicht, was es bedeutet. Ich würde mich sehr freuen, wenn jemand erklären könnte, warum wir diese Argumente verwenden, wenn wir sie nicht im Programm verwenden? Warum nicht einfach: int main()?

Ist der Name des Programms eines der Elemente von *argv[] und argc ist die Anzahl der Argumente in *argv[]? An was werden die anderen Argumente gesendet? *argv[]? Wie versenden wir sie?

  • Beachten Sie, dass es durchaus zulässig (und sehr sinnvoll) ist, die Funktion zu definieren, wenn Sie keine Befehlszeilenargumente verwenden möchten int main(void) oder int main(). Der Rückgabetyp (int) ist in C99 oder C11 obligatorisch; Compiler lassen Sie manchmal dennoch weg, wenn Sie nicht angeben, welcher Version des C-Standards Ihr Code entspricht. Siehe auch Was sollte main() Rückkehr in C und C++.

    – Jonathan Leffler

    5. Februar 2016 um 3:29 Uhr


Franks Benutzeravatar
Frank

Die Argumente argc und argv von main verwendet wird, um Argumente an ein Programm zu senden, ist der wahrscheinlich bekannteste Weg, das gute alte Terminal zu verwenden, wo ein Benutzer tippen könnte cat file. Hier das Wort cat ist ein Programm, das eine Datei nimmt und sie auf der Standardausgabe ausgibt (stdout).

Das Programm erhält die Anzahl der Argumente in argc und der Vektor der Argumente in argvin der obigen die Argument cAnzahl wäre zwei (Der Programmname zählt als erstes Argument) und die Argument vector enthalten würde [cat,file,null]. Während das letzte Element ein Nullzeiger ist.

Üblicherweise schreibt man es so:

int  // Specifies that type of variable the function returns.
     // main() must return an integer
main ( int argc, char **argv ) {
     // code
     return 0; // Indicates that everything went well.
}

Wenn Ihr Programm keine Argumente benötigt, ist es genauso gültig, a zu schreiben main-funktionieren wie folgt:

int main() {
  // code
  return 0; // Zero indicates success, while any 
  // Non-Zero value indicates a failure/error
}

In den frühen Versionen der C-Sprache gab es keine int Vor main wie dies angedeutet wurde. Heute gilt dies als Irrtum.

An Posix-kompatiblen Systemen (und Windows) besteht die Möglichkeit, einen dritten Parameter zu verwenden char **envp die einen Vektor der Programme enthält envIronment-Variablen. Weitere Variationen der Argumentliste des main Funktion existiert, aber ich werde sie hier nicht im Detail beschreiben, da sie kein Standard ist.

Auch die Benennung der Variablen ist a Konvention und hat keine eigentliche Bedeutung. Es ist immer eine gute Idee, sich daran zu halten, damit Sie andere nicht verwirren, aber es wäre ebenso gültig, es zu definieren main wie

int main(int c, char **v, char **e) {
   // code
   return 0;
}

Und für Ihre zweite Frage gibt es mehrere Möglichkeiten, Argumente an ein Programm zu senden. Ich würde Ihnen empfehlen, sich die anzuschauen exec*()Familie von Funktionen welches ist Posix-Standard, aber es ist wahrscheinlich Einfacher nur zu benutzen system("command arg1 arg2")aber die Verwendung von system() ist normalerweise verpönt, da es nicht garantiert auf jedem System funktioniert. Ich habe es nicht selbst getestet; aber wenn es keine gibt bash,zshoder eine andere auf einem *NIX-System installierte Shell, system() wird versagen.

  • Wenn ich mich nicht irre, als der minimal mögliche Wert von argc ist 1 und argv[0] hält die Schnur ./mymainprogram wohingegen argv[1] ist NULL. Meine Fragen sind- 1: Was ist der maximale Wert argc kann halten? 2: Was sind das für Strings, die dem hinzugefügt werden argv[]?

    – phougatv

    22. Januar 2015 um 6:21 Uhr

  • @barnes – Das Maximum ist betriebssystemabhängig. In Win32 hat die Befehlszeile selbst eine Längenbegrenzung von 32 KB, also argc hat eine praktische Grenze von 16K.

    – Jesse Chisholm

    10. Februar 2016 um 14:26 Uhr

  • @barnes: Altes DOS ist auf 127 Byte für Befehlszeilenargumente begrenzt, nicht dass es mehr wichtig wäre, aber nur eine lustige Tatsache, an die ich mich zufällig erinnere ^_^

    – Frank

    24. Februar 2018 um 9:31 Uhr

  • @JesseChisholm Mir ist klar, dass das jetzt ziemlich alt ist, aber es lohnt sich zu sagen, dass diese Grenze nicht gelten für Cygwin-Prozesse, die andere Cygwin-Prozesse starten (in solchen Fällen übergeben sie argv direkt). Außerdem habe ich daran gearbeitet eine Möglichkeit, das Windows-Limit zu umgehen.

    – al45tair

    12. Januar 2020 um 9:05 Uhr

  • char **envp als drittes Argument ist nicht Teil des POSIX-Standards. Siehe diesen Thread

    – ben

    17. März 2021 um 14:08 Uhr


Aruns Benutzeravatar
Arun

Diese dienen zum Übergeben von Argumenten an Ihr Programm, beispielsweise von der Befehlszeile, wenn ein Programm aufgerufen wird

$ gcc mysort.c -o mysort

$ mysort 2 8 9 1 4 5

Oben das Programm mysort wird mit einigen Kommandozeilenparametern ausgeführt. Innen main( int argc, char * argv[])dies würde dazu führen

Argument Count, argc = 7 

da es 7 Argumente gibt (das Programm mitzählen), und

Argument Vector, argv[] = { "mysort", "2", "8", "9", "1", "4", "5" };

Es folgt ein vollständiges Beispiel.

$ cat mysort.c
#include <stdio.h>
int main( int argc, char * argv [] ) {
    printf( "argc = %d\n", argc );
    for( int i = 0; i < argc; ++i ) {
        printf( "argv[ %d ] = %s\n", i, argv[ i ] );
    }
}

$ gcc mysort.c -o mysort

$ ./mysort 2 8 9 1 4 5
argc = 7
argv[ 0 ] = ./mysort
argv[ 1 ] = 2
argv[ 2 ] = 8
argv[ 3 ] = 9
argv[ 4 ] = 1
argv[ 5 ] = 4
argv[ 6 ] = 5

[The char strings “2”, “8” etc. can be converted to number using some character to number conversion function, e.g. atol() (link)]

Benutzeravatar von Colin Hebert
Colin Herbert

Mit argc (Argument zählen) und argv (Argumentvektor) Sie können die Anzahl und die Werte der übergebenen Argumente erhalten, wenn Ihre Anwendung gestartet wurde.

Auf diese Weise können Sie Parameter (wie z -version), wenn Ihre Anwendung gestartet wird, sich anders zu verhalten.

Kann man aber auch verwenden int main(void) als Prototyp in C.

Es gibt einen dritten (weniger bekannten und nicht standardmäßigen) Prototyp mit einem dritten Argument, nämlich envp. Es enthält Umgebungsvariablen.


Ressourcen:

  • Was hat der Name des Programms mit den an main() übergebenen Argumenten zu tun?

    Benutzer379888

    9. Oktober 2010 um 22:00 Uhr

  • @Potatoswatter, @You, ich habe meine Antwort aktualisiert, um ausdrücklich zu sagen, dass envp kein Standard ist. @fahad, normalerweise ist das erste Argument der Name der Anwendung, auf diese Weise können Sie wissen, wie Ihre Anwendung aufgerufen wurde.

    – Colin Hebert

    9. Oktober 2010 um 22:05 Uhr


  • Nur durch seinen Namen, wie würden Sie wissen, wie es genannt wurde?

    Benutzer379888

    9. Oktober 2010 um 22:07 Uhr

  • @fahad, ich meinte “wie die Anwendung benannt wurde”. Dies könnte beispielsweise verwendet werden, um eine Fehlermeldung wie “Illegal option… usage: applicationName [-v]”

    – Colin Hebert

    9. Oktober 2010 um 22:12 Uhr


  • In * nix-Betriebssystemen ist es nicht unmöglich, dass verschiedene “Programme” symbolische Links zu derselben ausführbaren Datei sind – wenn Sie wissen, wie sie aufgerufen wurde, kann sich diese ausführbare Datei je nach Name unterschiedlich verhalten. EIN klassisch Beispiel hierfür ist meiner Meinung nach die Busybox Dienstprogramm – dieselbe Datei verhält sich wie buchstäblich Hunderte von anderen Dienstprogrammen (vielleicht in einer “Reduzierung” oder nur die Implementierung der am häufigsten verwendeten Funktionalität von jedem) als nur eine ausführbare Datei, was in vielen Szenarien von Vorteil ist …

    – SlySven

    11. September 2016 um 15:42 Uhr

argc bedeutet die Anzahl der Argumente, die an das Programm übergeben werden. char* argv[] sind die übergebenen Argumente. argv[0] ist immer der Programmname selbst. Ich bin mir nicht 100% sicher, aber ich denke int main() ist in C/C++ gültig.

argc ist die Anzahl der Befehlszeilenargumente, die dem Programm zur Laufzeit gegeben werden, und argv ist ein Array von Arrays von Zeichen (eher ein Array von C-Strings), das diese Argumente enthält. Wenn Sie wissen, dass Sie die Befehlszeilenargumente nicht benötigen, können Sie Ihre main deklarieren, indem Sie a nehmen void Argument, stattdessen:

int main(void) {
    /* ... */ 
}

Dies sind die einzigen zwei Prototypen, für die definiert wurde main gemäß den Standards, aber einige Compiler erlauben einen Rückgabetyp von void auch. Mehr dazu auf Wikipedia.

  • Technisch, int main() ist eine Funktion mit beliebig vielen Argumenten, während int main(void) nimmt genau null Argumente, also ist letzteres richtiger.

    – Du

    9. Oktober 2010 um 22:45 Uhr

  • nein, bei a Definition, int main() ist eine Funktion ohne Parameter. In einem Erklärung Dies ist keine Definition, sondern eine Funktion, die nicht angegebene Parameter verwendet. Dies ist 6.7.5.3/14 in n1256 oder 6.5.5.3/10 in n794. Der Fragesteller fragt nach einer Definition.

    – Steve Jessop

    9. Oktober 2010 um 23:19 Uhr


Benutzeravatar von cschol
Schule

Das comp.lang.c FAQ befasst sich mit der Frage

"What's the correct declaration of main()?"

in Frage 11.12a.

  • Technisch, int main() ist eine Funktion mit beliebig vielen Argumenten, während int main(void) nimmt genau null Argumente, also ist letzteres richtiger.

    – Du

    9. Oktober 2010 um 22:45 Uhr

  • nein, bei a Definition, int main() ist eine Funktion ohne Parameter. In einem Erklärung Dies ist keine Definition, sondern eine Funktion, die nicht angegebene Parameter verwendet. Dies ist 6.7.5.3/14 in n1256 oder 6.5.5.3/10 in n794. Der Fragesteller fragt nach einer Definition.

    – Steve Jessop

    9. Oktober 2010 um 23:19 Uhr


Benutzeravatar von Aliostad
Alistad

argc ist die Anzahl der Befehlszeilenargumente und argv ist ein Array von Zeichenfolgen, die Befehlszeilenargumente darstellen.

Dies gibt Ihnen die Möglichkeit, auf die an das Programm übergebenen Argumente zu reagieren. Wenn Sie keine erwarten, können Sie genauso gut verwenden int main.

1421240cookie-checkBezüglich ‘main(int argc, char *argv[])’ [duplicate]

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

Privacy policy