Hauptargumente in C [duplicate]

Lesezeit: 8 Minuten

Benutzeravatar von Anthony
Antonius

Ich weiß nicht, was ich tun soll! Ich habe ein großes Verständnis von C-Grundlagen. Strukturen, Datei-IO, Strings usw. Alles außer CLA. Aus irgendeinem Grund kann ich das Konzept nicht verstehen. Irgendwelche Vorschläge, Hilfe oder Ratschläge. PS Ich bin ein Linux-Benutzer

Die Unterschrift von main ist:

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

argc bezieht sich auf die Anzahl der übergebenen Befehlszeilenargumente, die beinhaltet der tatsächliche Name des Programms, wie es vom Benutzer aufgerufen wird. argv enthält die eigentlichen Argumente, beginnend mit Index 1. Index 0 ist der Programmname.

Also, wenn Sie Ihr Programm so ausgeführt haben:

./program hello world

Dann:

  • argc wäre 3.
  • argv[0] wäre “./Programm”.
  • argv[1] wäre “Hallo”.
  • argv[2] wäre “Welt”.

  • Denn auf diese Weise geben Benutzer Informationen an Befehlszeilenprogramme weiter. Wenn es keine Befehlszeilenargumente gäbe, was würden Sie stattdessen vorschlagen? stdin? Umgebungsvariablen?

    – CDhowie

    14. November 2010 um 6:09 Uhr

  • Unter Linux könnten Sie dies beispielsweise tun ls -l somefile um in der Verzeichnisliste nach “somefile” zu suchen. Dies würde die Argumente „-l“ und „somefile“ an das Programm „ls“ übergeben. Unter Windows könnten Sie “irgendeine Datei verlegen”, und in diesem Fall würde das singuläre “somefile”-Argument an das “dir”-Programm übergeben.

    – CDhowie

    14. November 2010 um 6:20 Uhr

  • Haben Sie jemals ein befehlszeilengesteuertes Betriebssystem wie DOS oder Linux verwendet? Wenn nicht, verstehen Sie möglicherweise nicht, warum sie verwendet werden. In einer Befehlszeilenumgebung sind Befehlszeilenargumente das primäre Werkzeug, das Sie haben um Programmen mitzuteilen, was sie tun sollen.

    – CDhowie

    14. November 2010 um 6:22 Uhr

  • Nun, ein vollständiges Beispiel würde hier wahrscheinlich nicht passen, aber ich werde sagen, wenn Ihr Programm ein Argument akzeptieren und dann den Inhalt dieser Datei nach stdout ausgeben möchte, könnten Sie mit so etwas beginnen, vorausgesetzt, Sie schreiben dies hinein das main Funktion, wie oben definiert: if (argc != 2) { /* Need one argument */ printf("Usage: %s filename\n", argv[0]); return 1; } int fd = open(argv[1], O_RDONLY); ...

    – CDhowie

    14. November 2010 um 6:28 Uhr

  • idk Mann, ich verstehe alles, was ich weiß, wenn ich Nmap -SP 192.168.100.57-250 eingebe. nmap ist argv[0] der Name des Programms. und alles danach wird fortlaufend indiziert. Ich verstehe einfach nicht, wie man mit ihnen programmiert. idk y! Ich würde wirklich gerne lernen, aber ich habe dieses Problem aus irgendeinem Grund.

    – Antonius

    14. November 2010 um 6:29 Uhr

Stell es dir so vor

*main() is also a function which is called by something else (like another FunctioN)

*the arguments to it is decided by the FunctioN

*the second argument is an array of strings

*the first argument is a number representing the number of strings

*do something with the strings

Vielleicht hilft ein Beispielprogramm.

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

    printf("you entered in reverse order:\n");

    while(argc--)
    {
        printf("%s\n",argv[argc]);
    }

return 0;
}

Es gibt einfach alles aus, was Sie als Argumente in umgekehrter Reihenfolge eingeben, aber SIE sollten neue Programme erstellen, die etwas Nützlicheres tun.

Kompilieren Sie es (wie sagen Hallo) Führen Sie es vom Terminal aus mit den Argumenten wie

./hello am i here

Versuchen Sie dann, es so zu ändern, dass es versucht, zu überprüfen, ob zwei Zeichenfolgen umgekehrt sind oder nicht. Dann müssen Sie überprüfen, ob der argc-Parameter genau drei ist, wenn alles andere einen Fehler ausgibt

if(argc!=3)/*3 because even the executables name string is on argc*/
{
    printf("unexpected number of arguments\n");
    return -1;
}

prüfen Sie dann, ob argv[2] ist die Umkehrung von argv[1]
und drucken Sie das Ergebnis aus

./hello asdf fdsa

ausgeben soll

they are exact reverses of each other

Das beste Beispiel ist ein Dateikopierprogramm. Probieren Sie es aus, es ist wie cp

cp Datei1 Datei2

cp ist das erste Argument (argv[0] nicht argv[1]) und meistens sollten Sie das erste Argument ignorieren, es sei denn, Sie müssen darauf verweisen oder so

Wenn Sie das CP-Programm erstellt haben, haben Sie die Hauptargumente wirklich verstanden …

  • @antony Ich weiß, dass es frustrierend sein kann, nicht mit geringer Wiederholung kommentieren zu können, aber Sie hätten einfach eine andere Frage stellen oder andere ähnliche Fragen nachschlagen sollen, da Sie für Ihre Frage Ihre ausführbare Datei nicht als cp benennen sollten, aber trotzdem einfacher über die Befehlszeile zu kompilieren Verwenden Sie diesen Befehl für Ihre c-Datei, nachdem Sie cd verwendet haben, um das Verzeichnis zu erstellen, in dem sie sich befindet, indem Sie cd, gcc -o “Name der ausführbaren Datei” yourFile.c verwenden und sie dann mit ./ “Name der ausführbaren Datei” ausführen. das ist es!

    – Siamore

    16. November 2010 um 14:14 Uhr


Zum Analysieren von Befehlszeilenargumenten auf Posix-Systemen ist der Standard die Verwendung von getopt() Familie von Bibliotheksroutinen zur Verarbeitung von Befehlszeilenargumenten.

Eine gute Referenz ist die GNU getopt-Handbuch

Benutzeravatar von Anthony
Antonius

Siamore, ich sehe immer wieder, wie jeder die Befehlszeile benutzt, um Programme zu kompilieren. Ich verwende das x11-Terminal von ide über code::blocks, einen gnu gcc-Compiler auf meiner Linux-Box. Ich habe noch nie ein Programm von der Kommandozeile aus kompiliert. Also Siamore, wenn ich möchte, dass der Programmname cp ist, initialisiere ich argv[0]=”cp”; Cp ist ein String-Literal. Und alles, was nach stdout geht, geht auf die Befehlszeile??? Das Beispiel, das Sie mir Siamore gegeben haben, habe ich verstanden! Obwohl die eingegebene Zeichenfolge ein paar Wörter lang war, war es immer noch nur ein Argument. Weil es in doppelte Anführungszeichen eingeschlossen war. Also Arg[0], der Programmname, ist eigentlich Ihr String-Literal mit einem Zeilenumbruchzeichen?? Ich verstehe also, warum Sie den Druckfehler if (argc! = 3) verwenden. Da der Programmname = argv[0] und danach kommen 2 weitere Argumente, und es ist wieder ein Fehler aufgetreten. Aus welchem ​​anderen Grund würde ich das verwenden? Ich denke wirklich, dass mein mangelndes Verständnis darüber, wie man von der Befehlszeile oder dem Terminal aus kompiliert, der Grund für mein mangelndes Verständnis in diesem Bereich ist !! Siamore, du hast mir geholfen, Clas viel besser zu verstehen! Ich verstehe es immer noch nicht ganz, aber ich bin mir des Konzepts nicht bewusst. Ich werde lernen, vom Terminal aus zu kompilieren, und dann noch einmal lesen, was Sie geschrieben haben. Ich wette, dann werde ich es voll verstehen! Mit etwas mehr Hilfe von dir lol

<> Code, den ich nicht selbst geschrieben habe, sondern aus meinem Buch.

#include <stdio.h>

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

    printf("The following arguments were passed to main(): ");
    for(i=1; i<argc; i++) printf("%s ", argv[i]);
    printf("\n");

    return 0;
} 

Dies ist die Ausgabe:

anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hey man
The follow arguments were passed to main(): hey man
anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hi how are you doing?
The follow arguments were passed to main(): hi how are you doing?

argv ist also eine Tabelle von String-Literalen und argc ist die Anzahl davon. Jetzt argv[0] ist der Name des Programms. Wenn ich also ./CLA eingebe, um das Programm auszuführen, ist ./CLA argv[0]. Das obige Programm stellt die Befehlszeile so ein, dass sie unendlich viele Argumente akzeptiert. Ich kann sie so einstellen, dass sie nur 3 oder 4 nehmen, wenn ich wollte. Wie eines Ihrer Beispiele gezeigt hat, Siamore… if(argc!=3) printf(“Irgendein Fehler geht hier hin”); Danke Siamore, ohne dich hätte ich es nicht geschafft! Danke auch an den Rest der Post für ihre Zeit und Mühe!

PS, falls es in Zukunft ein Problem wie dieses gibt … man weiß nie, lol, das Problem lag daran, dass ich die IDE AKA Code::Blocks verwendet habe. Wenn ich dieses Programm oben ausführen würde, würde es den Pfad/Verzeichnis des Programms drucken. Beispiel: ~/Documents/C/CLA.c muss vom Terminal ausgeführt und über die Befehlszeile kompiliert werden. gcc -o CLA main.c und Sie müssen sich im Verzeichnis der Datei befinden.

Benutzeravatar von Yusuf Khan
Yusuf Khan

Main ist wie jede andere Funktion und argc und argv sind wie alle anderen Funktionsargumente, der Unterschied besteht darin, dass main von C Runtime aufgerufen wird und das Argument an main übergibt, aber C Runtime ist in der c-Bibliothek definiert und Sie können es nicht ändern , Wenn wir also ein Programm auf der Shell oder über eine IDE ausführen, benötigen wir einen Mechanismus, um das Argument an die Hauptfunktion zu übergeben, damit sich Ihre Hauptfunktion je nach Ihren Parametern zur Laufzeit unterschiedlich verhalten kann. Die Parameter sind argc , das die Anzahl der Argumente angibt, und argv , das ein Zeiger auf ein Array von Zeigern ist, das den Wert als Zeichenfolgen enthält. Auf diese Weise können Sie eine beliebige Anzahl von Argumenten übergeben, ohne sie einzuschränken. Dies ist die andere Möglichkeit, var args zu implementieren.

  • main wird von der Kathodenstrahlröhre aufgerufen? Möglicherweise möchten Sie Ihre Antwort aktualisieren, um zu sagen, dass CRT “C-Laufzeit” bedeutet.

    – Keith Thompson

    13. September 2013 um 18:30 Uhr

Benutzeravatar von Nebojsa Tomcic
Nebojsa Tomcic

Hatte nur eine kleine Änderung am @anthony-Code vorgenommen, damit wir eine schön formatierte Ausgabe mit Argumentnummern und -werten erhalten. Irgendwie einfacher, die Ausgabe zu lesen, wenn Sie mehrere Argumente haben:

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("The following arguments were passed to main():\n");
    printf("argnum \t value \n");
    for (int i = 0; i<argc; i++) printf("%d \t %s \n", i, argv[i]);
    printf("\n");

    return 0;
} 

Und die Ausgabe ist ähnlich wie:

The following arguments were passed to main():
0        D:\Projects\test\vcpp\bcppcomp1\Debug\bcppcomp.exe
1        -P
2        TestHostAttoshiba
3        _http._tcp
4        local
5        80
6        MyNewArgument
7        200.124.211.235
8        type=NewHost
9        test=yes
10       result=output

  • main wird von der Kathodenstrahlröhre aufgerufen? Möglicherweise möchten Sie Ihre Antwort aktualisieren, um zu sagen, dass CRT “C-Laufzeit” bedeutet.

    – Keith Thompson

    13. September 2013 um 18:30 Uhr

1416750cookie-checkHauptargumente in C [duplicate]

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

Privacy policy