Parameterübergabe an die main-Funktion

  • Was sind Kommandozeilenparameter?
  • Parameter für die main-Funktion
  • Parameter auslesen
  • Argumente verwenden

Was sind Kommandozeilenparamter?

Kommandozeilenparameter benutzen wir zum Beispiel, wenn wir den gcc-Compiler von der Konsole aufrufen:

gcc -o ausgabedatei quelltext.c

Wir haben bisher noch keine Möglichkeit gehabt, unseren Programmen Eingaben zu übergeben, unsere Programme konnten bisher also nur sehr spezielle Probleme lösen. Mit der Übergabe von Kommandozeilenparametern wollen wir nun unser Programm so gestalten, dass es sich um Probleme kümmern kann, die sich erst nach dem Kompilieren stellen. Wir werden uns daher um ein Programm kümmern, das als Eingabe zwei Zahlen erwartet und diese miteinander addiert.

Das Ziel wird sein, dass wir unser Programm mit den benötigten Eingaben als Parameter rufen:

addiere 4 7

Und anschließend das Ergebnis ausgeben lassen wollen.

Parameter für die main-Funktion

Wir haben die main-Funktion mit folgender Signatur verwendet:

int main( void )

Die main-Funktion ist einmalig, sie darf also nur einmal deklariert werden. Es gibt aber eine weitere Möglichkeit main zu formulieren, mit der wir Übergabeparameter erhalten können:

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

main erhält nun also zwei Parameter. Die Namen sind nicht festgelegt, aber argc und argv sind absolut üblich und sollten daher auch verwendet werden. argc steht dabei für Argument Count, also die Anzahl der Argumente (Parameter) und argv für Argument Values, also die eigentlichen Argument-Werte.

Die Grenze zwischen zwei Argumenten ist immer ein Whitespace. Wir sehen also, dass unser Vorhaben, einen Befehl wie addiere 4 7 zwei Argumente liefern muss, nämlich 4 und 7. Tatsächlich wird der Befehlsname addiere ebenfalls als Parameter verwendet. Unter Unix ist es nicht unüblich mehrere Befehle über ein Programm abzubilden, zum Beispiel ls, um ein Verzeichnis aufzulisten (ohne versteckte Dateien) und -la für das Listen mit der -a-Option, so dass auch versteckte Dateien angezeigt werden.

Parameter auslesen

So, jetzt können wir ein erstes Programm mit der neuen main-Funktion schreiben und schauen uns die Argumente an:

#include <stdio.h>
 
int main( int argc, char* argv[] )
{
  printf("Anzahl der Argumente: %d\n", argc);
  printf("Pfad: %s\n", argv[0]); // Erstes Argument ausgeben
 
  // Die restlichen Argumente ausgeben:
  int i = 1;
  for(; i < argc; ++i)
    printf("Argument %d: %s\n", i, argv[i]);
 
  return 0;
}

Wenn wir dieses Programm jetzt auf addiere (bzw. addiere.exe) kompilieren und es auf, dann rufen dann sollte etwa folgende Ausgabe herauskommen:

Anzahl der Argumente: 3
Pfad: ./addiere
Argument 1: 4
Argument 2: 7

Den Aufruf machen wir unter Linux und Macintosh mit

$ ./addiere 4 7

und unter Windows mit

X:\Pfad\zur\Datei> addiere 4 7

Argumente verwenden

Nun erhalten wir allerdings Strings als Argumente, mit denen wir nicht rechnen können. Um die Strings in Interger zu verwandeln, bedienen wir uns aus der C-Standard-Bibliothek und finden dort die Funktion atoi() (ASCII to Integer).

#include <stdio.h>
#include <stdlib.h>
 
int main( int argc, char* argv[] )
{
  if( argc != 3 ) // Wächter
  {
    printf( "Falsche Anzahl von Argumenten\n" );
    return 0;
  }
 
  int summand1 = atoi( argv[1] );
  int summand2 = atoi( argv[2] );
 
  printf( "Ergebnis: %d\n", summand1+summand2 );
 
  return 0;
}

Fertig.

Ziel dieser Lektion

Wir haben gelernt, Eingaben an unser Programm zu machen, so dass wir nun Einfluss auf unser Programm nehmen können. Wir können Eingaben, die als String vorliegen in Integer umrechnen. Experimentiere damit! Schreibe Funktionen, die die Argumente argv[1] und argv[2] daraufhin prüfen, ob sie gültige Zahlen sind oder ungültige Zeichen enthalten und gib gegebenenfalls eine Fehlermeldung aus. Verwende dafür zum Beispiel isdigit() aus der C-Standard-Library. Erweitere Dein Programm, so dass Du beliebig viele Zahlen addieren kannst:

addiere 1 2 3 4 5

Füge eine Optionen “-addition“ und “-substraction“ hinzu, die vor den zu verrechnenden Werten stehen. Schau Dir hierfür die Funktion strcmp() aus der C-Standard-Library an.

calc -addition 1 2 3 4
calc -substraction 10 3 2 1

Wenn Du soweit bist, schauen wir uns in der nächsten Lektion dynamische Speicherverwaltung an.