C Kurze Frage bezüglich Kommandozeilenparameter

DrToxic

Rear Admiral
Registriert
Juni 2008
Beiträge
6.068
Hey,

ich schreibe demnächst meine Klausur in Informatik bzw. C und soweit ist alles kein Problem, bis auf die Kommandozeilenparameter, die laut Dozent wichtig sind für die Klausur, aber irgendwie am Ende nur 2 Minuten behandelt wurden.

Wortlaut Skript:
Zeichenfolgen als Parameter übergeben:

  • agc (argument count): Anzahl der beim Aufruf angegebenen Kommandozeilenparameter inkl. Programmname
  • argv (argument vector): Vektor von Zeigern auf die angegebenen Kommandozeilenparameter
  • argv [0] = Programmname

Rückgabewert 0: erfolgreich ausgeführtes Programm
Mehr steht dazu nicht. Ich kenne Kommandozeilenparameter eigentlich nur als.. naja.. Kommandozeilenparameter halt, wie in der Windows cmd-Konsole, z.B.:
Code:
shutdown -s -t 120
Wobei dann die Parameter -s für Herunterfahren und -t xxx für den Timer in Sekunden stehen.

So ziemlich das gleiche in grün steht auch bei Wikipedia, ich stehe jetzt von daher ein wenig auf dem Schlauch, weil ich da einfach keinen Bezug zu den oben genannten Befehlen sehe.

Was genau ist damit gemeint? Was kann man damit machen und wofür braucht man das?
 
Du bekommst in argv einfach alles übergeben, was hinter dem Programmnamen als Parameter mit angegeben wurde - jeder Parameter in einem argv-Eintrag. argc gibt die Anzahl der Argumente an, da es in C ja keine Möglichkeit gibt, irgendwie die Größe des Arrays rauszubekommen.
In deinem Beispiel "shutdown -s -t 120" würdest du also folgendes bekommen:

argv[0] = shutdown
argv[1] = -s
argv[2] = -t
argv[3] = 120
argc = 4

Machen kannst Du damit was Du magst, beispielsweise eine Datei angeben, die von deinem Programm verarbeitet werden soll oder sonst irgendwas.

Kleines Beispiel (nicht getestet, nur sinngemäß):

Code:
int main(int argc, char* argv) {
int i, anzahl;
printf("Ich bin das Programm %s\n", argv[0]);
anzahl = atoi(argv[1]);
for(i = 1; i < =anzahl; ++i) {
  printf("Schleife %d von %d\n", i, anzahl);
}
return 0;
}

Ruf das mal auf mit dem Parameter 5: Es gibt Dir den Programmnamen aus und zählt dann von 1 bis 5 hoch.
 
Zuletzt bearbeitet:
du hast in c ja deine main-Routine:

int main(int argc, char** argv)
{
.....
}

wenn dein programm test.exe heißt und du es mit test.exe -t 123 -s startest, dann ist

argc = 4 (programmname + 3 parameter)
argv[0] = test.exe
argv[1] = -t
argv[2] = 123
argv[3] = -s

dann müssen die ausgaben halt ausgewertet werden....

MFG Sheeep
 
Bei deinem Beispiel wuerde argc den Wert 4 haben und argv[1] "-s" (argv[2] "-t", argv[3] "1200") enthalten.
Dadurch lassen sich die beim Aufruf angegebenen Parameter auslesen, das Programm muss ja wissen, wann es den shutdown durchführen soll.
 
Das ist eigentlich relativ einfach. Nehmen wir nur dein Beispiel: "shutdown -s -t 120"

Sagen wir shutdown ist dein von dir geschriebenes Program, welchem dann über den Aufruf per Kommandozeile der main() Funktion "-s -t 120" als Parameter im Vektor übergeben werden.

In deinem shutdown-Beispiel sieht das dann so aus:

argv[0] = "shutdown"
argv[1] = "-s"
argv[2] = "-t"
argv[3] = "120"
argv[4] = NULL
 
Aaaaah!

Jetzt macht das alles auch Sinn. War doch nicht so kompliziert wie gedacht.

Ein Mitstudent meinte, dass das die Anzahl der verwendeten Befehle im Programm zählt, wie z.B. for, if, while etc, die Erklärung fande ich ein wenig seltsam :D

Die main-Routine haben wir leider nicht behandelt, das war ja nur ein ein-Semester-Kurs für komplette Neulinge. Ich beherrsche jetzt die basics von C, also quasi alles, was in der main statt findet, Funktionen und dass man Bibliotheken einbinden kann.

Aber darauf, dass die Main-Funktion selbst natürlich auch Parameter übernehmen bzw -geben kann, bin ich erstmal nicht gekommen, weil wir nur mit int main (void) und return 0; gearbeitet haben :p

Sorry für die simple Frage und danke für die schnellen Antworten!


edit: Komme mir jetzt ein wenig dämlich vor, dass ich da nicht selber drauf gekommen bin. Irgendwie hatte ich ein Brett vorm Kopf :freak:
 
Zuletzt bearbeitet:
Würde für Fälle, die OP nennt, der Einfachheithalt halber getopt() benutzen.
 
Zurück
Oben