15.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 Kommandozeilen-Argumente, um Schalter auszuwerten. Etwa:
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 dem 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, womit Sie einen Text auf die Standardausgabe schicken können. Beispielsweise mit
echo Hallo Welt
wird »Hallo Welt« auf dem Bildschirm ausgegeben. Das folgende Programm ist ein eigenes Echo, myecho, womit 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 der vollständige 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, welches Sie natürlich weiter ausbauen können.
Hier wurden außerdem Funktionen der Standard-Headerdatei <ctype.h> verwendet, die der Ü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() 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, soll hier noch auf die echten Funktionen getopt(), getopt_long() oder gar auf die POPT-Bibliothek hingewiesen werden, welche auf vielen Systemen vorhanden sind und Ihnen die ganze Arbeit recht komfortabel abnehmen.
|
|