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
Hauptargumente in C [duplicate]
Antonius
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
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.
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
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
Hier ist ein Video zum Ansehen, youtu.be/xtZZTsfA1g0 Wenn Sie einen Quellcode zum Ansehen benötigen zakalberda.wordpress.com/2017/04/18/…
– pewpew
19. April 2017 um 16:04 Uhr