next up previous contents
Nächste Seite: 14 Umgang mit Dateien Aufwärts: C-Programmierung Vorherige Seite: 12 Arbeiten mit Texten:   Inhalt

Unterabschnitte

13 Funktionen für Zeichenketten

13.1 Beispiel

13.2 Erklärung

Eingabefunktion 1

   scanf("%20s",x);

- liest ein Wort (ohne \t,\n, \r, \v, \f und Leerzeichen) mit maximal 19 Zeichen nach x und schließt es mit \0 ab. Falls mehr Zeichen eingegeben wurden, liest es den Rest beim nächsten Aufruf von scanf().

Eingabefunktion 2

   fgets(x, 20, stdin);

- liest eine Zeile, also bis zu einem \n, jedoch maximal 19 Zeichen nach x und schließt es mit \0 ab. Falls mehr Zeichen eingegeben wurden, liest es den Rest beim nächsten Aufruf von fgets(). Das Zeilentrennzeichen \n gehört auch zur Zeile und wird somit im Ergebnis abgelegt. Damit kann man ermitteln, durch welches der beiden Kriterien (Zeilenende oder Überschreiten der erlaubten Zeilenlänge) fgets() beendet wurde.

Bei EOF ist das Ergebnis von fgets() null.

Eingabefunktion 3

   gets(x);

- liest eine Zeile, also bis zu einem \n, beliebig viele Zeichen nach x und schließt es mit \0 ab. Das Zeilentrennzeichen \n gehört auch zur Zeile und wird somit im Ergebnis abgelegt.

VORSICHT:

Vergleichsfunktion 1

   x=strcmp(a, b);

Ergebnis:

Vergleichsfunktion 2
   x=strncmp(a, b, n);

Ebenso, jedoch werden nur die ersten n Zeichen verglichen.

Concat-Funktion 1

   strcat(a, b);

Hängt die Zeichenkette b an die Zeichenkette a an.

Concat-Funktion 2

   strncat(a, b, n);

Hängt maximal n Zeichen der Zeichenkette b an die Zeichenkette a an.

Kopierfunktion 1

   strcpy(a, b);

Kopiert den Inhalt von b nach a.

Kopierfunktion 2

   strncpy(a, b, n);

Kopiert maximal n Zeichen von b nach a.

VORSICHT:

Im Einzelfall sind statt strncpy() meistens andere Funktionen (memcpy(), memmove()) vorzuziehen.

13.3 Aufgabe

13.4 Lösung

  1. Nach der Top-Down-Methode fängt man mit einem leeren Struktogramm an:

    \includegraphics{kap_zeichenketten2/sg0_bestellcode.eps}

    Bei diesem Programm kann das EVA-Prinzip angewandt werden, da nacheinander Eingabe, Verarbeitung und Ausgabe folgen:

    \includegraphics{kap_zeichenketten2/sg1_bestellcode.eps}

  2. In einem zweiten Schritt ist es sinnvoll, die gegebenen Datenstrukturen zu ermitteln:

    index 0 1 2
    bestcode 3x1 4x6 8x3
    artbez Jacke Hose Hemd

  3. Im dritten Schritt sollte auf dem Papier eine Programmvorschrift entstehen, die es einem roboterhaft denkenden Menschen ermöglichten, die Aufgabe zu lösen:

    \includegraphics{kap_zeichenketten2/algo3.eps}

  4. Dieser auf dem Papier erdachte Programmweg (Algorithmus) soll nun realisiert werden; dazu muss zuerst die Schleife verwirklicht werden, die das Durchlaufen der einzelnen Bestellcodes ermöglicht:

    \includegraphics{kap_zeichenketten2/sg4_bestellcode.eps}

  5. Nun ist der Schleifenkopf angelegt, nur der Inhalt (der Schleifenrumpf), der bei jedem Durchlauf ausgeführt wird, fehlt noch. In jedem Durchlauf soll der eingegebene Bestellcode mit dem Bestellcode der jeweiligen Zeile verglichen werden. Bei Verschiedenheit soll nichts passieren:

    \includegraphics{kap_zeichenketten2/sg5_bestellcode.eps}

  6. Bei Gleichheit soll etwas passieren: Die Warenbezeichnung dieser Zeile soll in die Ausgabezeichenkette kopiert werden.

    \includegraphics{kap_zeichenketten2/sg6_bestellcode.eps}

  7. Es ergibt sich damit folgendes Programm:

      1	/* bestellcode.c */
      2	
      3	#include <stdio.h>
      4	#include <stdlib.h>
      5	#include <string.h>
      6	
      7	#define ANZAHL 6
      8	
      9	int main()
     10	{
     11	   char bestcode[ANZAHL][21]={"3x1","4x6","8z3",
     12	                              "13x","abc","xyz"};   
     13	   char artbez  [ANZAHL][21]={"Jacke","Hemd","Hose",
     14	                              "Schuh","Socke","Mantel"};
     15	   char eintext[21];   
     16	   char austext[21]="-nicht gefunden!-";
     17	   int  lauf;
     18	
     19	   printf("Bitte die Bestellnummer eingeben:");
     20	   scanf("%20s", eintext);
     21	   
     22	   for(lauf=0; lauf<ANZAHL; ++lauf)
     23	   {
     24	      if(!strcmp(eintext, bestcode[lauf]))
     25	      {
     26	         strcpy(austext, artbez[lauf]);
     27	      }
     28	   }
     29	
     30	   printf("Die Warenbezeichnung lautet: %s\n", austext);
     31	   exit(0);
     32	
     33	}/* main */
    


next up previous contents
Nächste Seite: 14 Umgang mit Dateien Aufwärts: C-Programmierung Vorherige Seite: 12 Arbeiten mit Texten:   Inhalt
Joerg Kurrek 2004-04-02