ein Kapitel zurück                                           ein Kapitel weiter

Kommandozeilenparameter sind eines der wichtigsten Konzepte der Entwicklung von Tools. Bestimmt kennen sie den Befehl : 'rename' zum umändern eines Namen einer Datei wie z.B.....

rename text.txt dokument.txt

In diesem Fall wird die Textdatei 'text.txt' umbenannt in 'dokument.txt'. Hier haben wir 3 Kommandozeilenparameter. 'rename' ist der 1. 'text.txt' der 2. und 'dokument.txt' der 3. Parameter. Wobei der 1. Parameter ('rename') für den Programmnamen steht.


Anmerkung: Dieser Teil des Kurses ist nicht für Programmieroberflächen (IDE´s) geeignet. Da sie dem Programm Argumente übergeben werden. Unter Linux ist das eigentlich ja ganz normal. Unter Windows müssen sie dabei unter MS-DOS die Argumente übergeben. Das Dos-Fenster unter MS-WIN tut es aber auch schon. Das übersetzen eines Programms funktioniert normalerweise auch unter DOS. Bei Borland-Compilern z.B. übersetzen sie Programme unter DOS mittels....
bcc name.c
Bei anderen IDE´s schauen sie am besten in die Online - Hilfe wie sie den Quellcode unter MS-Dos übersetzen. Zu Linux - User muss dazu wohl nichts gesagt werden. Linux ohne Kommandozeile -


Zurück zum Thema! Wie machen wir das mit der Kommandozeile? Nun das ist eigentlich ganz einfach. Wir parameterisieren unser main() - Funktion. Dazu benötigen wir 2 Parameter. Hier der Syntax....

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

Die Namen 'argc' und 'argv' sind nicht vorgeschrieben. Nur werden sie eigentlich immer so geschrieben, also werden wir sie auch so verwenden. Sie könnten genauso gut schreiben...

int main(int argzaehler,char *argvektor[])

Der 1. Parameter also 'int' beinhaltet die Anzahl der Argumente die wir einem Programm übergeben. Der zweite Parameter ist ein Zeiger auf ein Feld. In im stehen die Namen die wir in der Kommandozeile eingegeben haben. Alternativ können sie anstatt 'char *argv[]' auch schreiben ....

char **argv

Wenn sie nicht mehr wissen wieso, lesen sie bitte nochmals im Kapitel 'Zeiger Teil 4' nach. Beide Varianten sind gleichbedeutend.

Nun mal ein Beispiel zum Thema....

/*Download:arg1.c*/
#include <stdio.h>

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

for(i=0; i<argc; i++)
{
printf("argv[%d] = %s ",i,argv[i]);
printf("\n");
}
return 0;
}

Nehmen wir mal an sie speichern das Programm unter dem Namen 'Argument.c' und anschließend Compilieren und Linken sie das Programm. Wenn sie das Programm jetzt ausführen wie gewohnt bekommen sie den Programmnamen inklusive den Pfad in dem sie das Programm gespeichert habe ausgegeben...

argv[0] = /home/sourcen/C/Argument

...oder...

argv[0] = C:\djgpp\bin\sourcen\Argument.exe

Bei jedem wird die Ausgabe etwas anderes aussehen. Jetzt starten sie das Programm doch mal mit folgender Eingabe...

Argument Hallo Welt

Die jetzige Ausgabe wird sein.....

argv[0] = ..<Pfadangabe
argv[1] = Hallo
argv[2] = Welt


'argv[0]' also das 1. Argument ist immer der Programmname selber. Die einzelnen Argumente werden immer mit mindestens einer Leerzeile getrennt. Würden sie eingeben...

Argument HalloWelt

...wäre die Ausgabe...

argv[0] = ..<Pfadangabe
argv[1] = HalloWelt


Unser 'int argc' zählt unsere Anzahl der Parameter das Anschließend im Indexfeld von argv[index] verwendet wird. Als beweis können sie ja folgendes Beispiel testen...

/*Download:arg2.c*/
#include <stdio.h>

int main(int argc, char **argv)
{
printf("%s",argv[argc-1]);

return 0;
}

Bei diesem kleinen Beispiel wird immer unser letztes Argument ausgegeben. Schauen wir uns das ganze mal grafisch an. Als Programmaufruf nehmen wir ....

Argument abc xyz

In 'char *argv[]' haben wir dann.....


Argument aus der Kommandozeile


Hierbei sehen sie das Argumente immer in Form von Zeichenketten an das Programm übergeben werden auch wenn die Argumente aus Ziffern bestehen. Ziffern müssen falls als Wert benötigt Konvertiert werden. Hierzu wieder ein kleines Beispiel....

/*Download:arg3.c*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


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

if(argc < 4)
{
fprintf(stderr,"Benötige mindestens 4 Argumente!\n");
fprintf(stderr,"Aufruf: a.out <zahl> <op> <zahl>\n");
exit(1);
}

erg = atoi(argv[1]); /*die 1. Zahl in einem Integer umwandeln*/

for(i=1; i<argc-1; i+=2)
{
for(j=i+1;j<i+2;j++)
{
y = atoi(argv[i+2]);

if(strcmp(argv[j],"+") ==0)
{
erg+=y;
}
else if(strcmp(argv[j],"-") ==0)
{
erg-=y;
}
else if(strcmp(argv[j],"*") ==0)
{
erg*=y;
}
else if(strcmp(argv[j],"/") ==0)
{
erg/=y;
}
else
{
fprintf(stderr,"Ungültiger Operand : %s ???\n",argv[j]);
exit(1);
}
}/*for*/
}/*for*/
printf("%d",erg);
return 0;
}

Hier haben wir die Möglichkeiten einfache Rechenoperationen auszuführen. Aber gehen wir das Programm Schritt für Schritt durch. Nehmen wir an sie haben das Programm mit dem Namen 'calc.c' gespeichert und anschließend Compiliert. Jetzt geben wir in der Kommandozeile ein...

calc 5 + 5 - 9 * 10 / 2

Als Ergebnis müssten sie 5 erhalten. Intern sieht das ganze so aus....

Argumente aus der Kommandozeile


Wir haben hier insgesamt 10 Argumente. Somit hat unser Parameter 'int argc' in der Funktion main() den Wert 10. Bitte beachten sie bei der Eingabe in der Kommandozeile das sie nach jedem Zeichen eine Leerspalte lassen. Folgendes würde nicht funktionieren....

calc 5+5-9*10/2   //falsch -

Mit...

if(argc < 4)
  {
   fprintf(stderr,"Benötige mindestens 4 Argumente!\n");
   fprintf(stderr,"Aufruf: a.out <zahl
   exit(1);
  }


..testen wir erst mal ob mehr wie 4 Argumente eingegeben wurden. Falls nicht schreiben wir mittels 'fprintf' formatiert in dem Stream 'stderr' und bekommen eine entsprechende Fehlermeldung zurück. exit beendet das aufrufende Programm. Vor dem Rücksprung werden sämtliche Dateipuffer geschrieben, offene Dateien geschlossen und (mit atexit) festgelegte Exit-Funktionen aufgerufen. Die Funktion beendet das Programm mit dem als status angegebenen Exit-Code, der vom aufrufenden Prozeß geprüft werden kann. Der Wert Null steht normalerweise für eine fehlerfreie Ausführung, Werte ungleich Null signalisieren Fehler. Folgende Konstanten stehen für status zur Verfügung...

EXIT_FAILURE : Fehlerhaftes Programmende - Signal an das Betriebssystem, daß das Programm mit einem Fehler endete.
EXIT_SUCCESS : Normales Programmende.


Falls mehr wie 4 Argumente übergeben wurden geht es mit ....

erg = atoi(argv[1]);

...weiter. Mit der Funktion 'atoi()' konvertieren sie das Zeichen das in 'argv[1]' steht, bei uns das Zeichen "5" in den Integerwert 5. atoi steht in der Headerdatei <stdlib.h>. Des weiteren gibt auch noch die Funktionen 'atof()' und 'atol()'. atof macht aus einem String eine Gleitkommazahl und atol macht aus einem String einen long - Wert.

Weiter geht's mit....

for(i=1; i<argc-1; i+=2)
  {
   for(j=i+1;j<i+2;j++)
    {
     y = atoi(argv[i+2]);


Unsere 1. for - Schleife durchläuft immer die ungeraden Zahlen also alle Indexe wo Zahlen stehen. [1]='5', [3]='5', [5]='9', [7]='10', [9]='2'. Unsere 2. for Schleife dient für unsere Operatoren +,-,* und /. Also alle geraden Zahlen vom Index : [2] ='+', [4]='-', [6]='*', [8]='/'. Natürlich sind die Zahlen und Operatoren nichts anderes wie Zeichenketten. In der 2. for - Schleifen inne bekommt die Variable y den Dezimalen Wert der Zeichenkette 'argv[3]' den wir wiederum mittels atoi konvertieren.

Jetzt testen wir mit....

if(strcmp(argv[j],"+") ==0)
      { 
       erg+=y; 
      }


ob 'argv[2]' gleich mit dem Zeichen "+" ist. Den Befehl 'strcmp' haben wir bereits kennen gelernt. In unserem Fall ist das 2. Argument tatsächlich das Zeichen "+". Nun können wir den 1. Wert (ehemals 1.Argument) mit dem 2. Wert (ehemals 3.Argument) addieren. Der Wert bleibt uns in der Variablen 'erg' erhalten. Genauso läuft es mit den nächsten Zahlen und Operatoren ab, bis keine Argumente (Zahlen oder Operatoren) vorhanden sind.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf