13.2 Optionen (Schalter) aus der Kommandozeile auswerten 

Der Taschenrechner, wie Sie ihn eben programmiert haben, macht in der heutigen Zeit wenig Sinn. Sinnvoller und (immer noch) sehr häufig verwendet werden Kommandozeilenargumente, um Schalter auszuwerten, etwa so:
rm --help
Damit wird eine kurze Hilfsanleitung des Programms rm angezeigt. Meistens handelt es sich dabei um eine kurze Beschreibung, mit welchen Optionen (Schaltern) das Programm aufgerufen werden kann und was diese bewirken. Das Programm rm ist in der UNIX-Welt beheimatet und dient zum Löschen von Dateien und Verzeichnissen. Beispielsweise wird mit den Schaltern -rf
rm -rf verzeichnis
ein ganzes Verzeichnis rekursiv ohne Nachfrage gelöscht. Dazu folgt jetzt ein Beispiel. Auf (fast) jedem System gibt es das Programm echo, mit dem Sie einen Text auf die Standardausgabe schicken können. Beispielsweise wird mit
echo Hallo Welt
»Hallo Welt« auf dem Bildschirm ausgegeben. Das folgende Programm ist ein eigenes Echo, myecho, mit dem der Text mithilfe von Schaltern spiegelverkehrt, in Groß- oder Kleinbuchstaben ausgegeben werden kann. Folgende Schalter werden verwendet:
void show_help(void) { printf("\nProgrammaufruf: myecho [OPTION] STRING\n"\ "Programm gibt den Text in gewünschter Form auf"\ "dem Bildschirm aus\n\n nFolgende Optionen stehen"\ "Ihnen zur Verfügung:\n\n"\ "\t-r Text wird spiegelverkehrt ausgegeben\n"\ "\t-g Text wird in Grossbuchstaben ausgegeben\n"\ "\t-s Text wird in Kleinbuchstaben ausgegeben\n "\ "\t-h Dieser Text\n" "\t-v Versionsnummer\n\n"); }
Hier sehen Sie den vollständigen Quellcode:
/* myecho.c */ #include <stdio.h> #include <string.h> #include <ctype.h> /* tolower(), toupper(), isalpha() */ #include <stdlib.h> #define FALSE 0 #define TRUE 1 #define BUF 4096 void show_help(void) { printf("\nProgrammaufruf: myecho [OPTION] STRING\n"\ "Programm gibt den Text in gewünschter Form auf"\ "dem Bildschirm aus\n\nFolgende Optionen stehen"\ "Ihnen zur Verfügung:\n\n"\ "\t-r Text wird spiegelverkehrt ausgegeben\n"\ "\t-g Text wird in Grossbuchstaben ausgegeben\n"\ "\t-s Text wird in Kleinbuchstaben ausgegeben\n "\ "\t-h Dieser Text\n" "\t-v Versionsnummer\n\n"); } int getopt(char *argument, char *option) { if( argument[0]=='-' && argument[1]==option[0] ) return TRUE; return FALSE; } void spiegeln(char *string) { char *reverse = string; while(*reverse++); while(reverse-- != string) printf("%c",*reverse); printf("\n"); } void larger(char *string) { char *large=string; while(*large) printf("%c",(isalpha(*large))?toupper(*large++):*large++); printf("\n"); } void smaller(char *string) { char *small=string; while(*small) printf("%c",(isalpha(*small))?tolower(*small++):*small++); printf("\n"); } int main(int argc, char *argv[]) { int counter=3; char buffer[BUF]; size_t len=0; if(argc == 1 || getopt(argv[1],"h") == TRUE ) { show_help(); return EXIT_FAILURE; } else if(getopt(argv[1],"v") == TRUE) { printf("Version 1.0\n"); return EXIT_SUCCESS; } else if(argc < 3) { show_help(); return EXIT_FAILURE; } len=strlen(argv[2])+1; /* ab argv[2] bis argv[n] alle Elemente in buffer */ if(len > BUF) { printf("Der String enthält zu viele Zeichen\n"); return EXIT_FAILURE; } strcpy(buffer,argv[2]); while(argv[counter] != NULL) { len += strlen(argv[counter])+2; if(len > BUF) { printf("Der Puffer ist bereits voll\n"); break; } strcat(buffer, " "); strcat(buffer, argv[counter++]); } if(getopt(argv[1],"r") == TRUE) spiegeln(buffer); else if(getopt(argv[1],"g") == TRUE) larger(buffer); else if(getopt(argv[1],"s") == TRUE) smaller(buffer); else show_help(); return EXIT_SUCCESS; }
Als Kernstück in diesem Programm dient die Funktion getopt():
int getopt(char *argument, char *option) { if( argument[0]=='-' && argument[1]==option[0] ) return TRUE; return FALSE; }
Damit wird überprüft, ob der String mit dem Schalterzeichen (-) beginnt und ob für option eine Option vorhanden ist:
if(getopt(argv[1],"s") == TRUE)
Hier wird beispielsweise überprüft, ob der Schalter s verwendet wurde. Falls dies zutrifft, wird TRUE zurückgegeben, andernfalls FALSE. Alle anderen Funktionen dienen nur zur Verzierung des Programms, das Sie natürlich weiter ausbauen können.
Hier wurden außerdem Funktionen der Standard-Headerdatei <ctype.h> verwendet, die zur Überprüfung und Konvertierung von einzelnen Zeichen dienen. Die Funktion isalpha() überprüft, ob es sich um ein Zeichen des Alphabets handelt. Ist dies der Fall, liefert diese Funktion 1 zurück. Die Funktion tolower() macht aus einem großen Buchstaben einen kleinen, und toupper() macht aus einem kleinen Buchstaben wieder einen großen. Mehr zu dieser Headerdatei und den darin enthaltenen Funktionen erfahren Sie später.
Hinweis |
Damit nicht jeder sein eigenes getopt() baut, möchte ich hier noch auf die echten Funktionen getopt(), getopt_long() bzw. auf die POPT-Bibliothek hinweisen, die auf vielen Systemen vorhanden sind und Ihnen die ganze Arbeit recht komfortabel abnehmen. |
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.