Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch für Linux, Unix und Windows
– 2., aktualisierte und erweiterte Auflage 2006
Buch: C von A bis Z

C von A bis Z
1.116 S., mit CD, Referenzkarte, 39,90 Euro
Galileo Computing
ISBN 3-89842-643-2
gp Kapitel 15 Kommandozeilenargumente
  gp 15.1 Argumente an die Hauptfunktion
  gp 15.2 Optionen (Schalter) aus der Kommandozeile auswerten


Galileo Computing - Zum Seitenanfang

15.2 Optionen (Schalter) aus der Kommandozeile auswerten  toptop

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.


 << zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z
C von A bis Z
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-Programmierung


Zum Katalog: C/C++






 C/C++


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Reguläre Ausdrücke






 Reguläre Ausdrücke


Zum Katalog: Linux






 Linux


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de