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

Inhaltsverzeichnis
Vorwort
Vorwort des Gutachters
1 Einstieg in C
2 Das erste Programm
3 Grundlagen
4 Formatierte Ein-/Ausgabe mit »scanf()« und »printf()«
5 Basisdatentypen
6 Operatoren
7 Typumwandlung
8 Kontrollstrukturen
9 Funktionen
10 Präprozessor-Direktiven
11 Arrays
12 Zeiger (Pointer)
13 Kommandozeilenargumente
14 Dynamische Speicherverwaltung
15 Strukturen
16 Ein-/Ausgabe-Funktionen
17 Attribute von Dateien und das Arbeiten mit Verzeichnissen (nicht ANSI C)
18 Arbeiten mit variabel langen Argumentlisten – <stdarg.h>
19 Zeitroutinen
20 Weitere Headerdateien und ihre Funktionen (ANSI C)
21 Dynamische Datenstrukturen
22 Algorithmen
23 CGI mit C
24 MySQL und C
25 Netzwerkprogrammierung und Cross–Plattform-Entwicklung
26 Paralleles Rechnen
27 Sicheres Programmieren
28 Wie geht’s jetzt weiter?
A Operatoren
B Die C-Standard-Bibliothek
Stichwort

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch
Buch: C von A bis Z

C von A bis Z
3., aktualisierte und erweiterte Auflage, geb., mit CD und Referenzkarte
1.190 S., 39,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1411-7
Pfeil 13 Kommandozeilenargumente
Pfeil 13.1 Argumente an die Hauptfunktion übergeben
Pfeil 13.2 Optionen (Schalter) aus der Kommandozeile auswerten


Rheinwerk Computing - Zum Seitenanfang

13.2 Optionen (Schalter) aus der Kommandozeile auswerten topZur vorigen Überschrift

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.

<< zurück
  
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: C von A bis Z

 C von A bis Z
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: C/C++






 C/C++


Zum Rheinwerk-Shop: Einstieg in C






 Einstieg in C


Zum Rheinwerk-Shop: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Rheinwerk-Shop: C++ Handbuch






 C++ Handbuch


Zum Rheinwerk-Shop: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2009
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.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern