Lösung der Aufgabe 1-43 inklusive Problemanalyse und Algorithmusentwurf<

Ein konkretes Beispiel:
vorher, Zeichenkette s:

Inhalt 0 5 5 2 2 / 5 1 4 - 2 3 4 \0
Index i 0 1 2 3 4 5 6 7 8 9 10 11 12 13

nachher:

Inhalt 0 5 5 2 2 5 1 4 2 3 4 \0
Index j 0 1 2 3 4 5 6 7 8 9 10 11 12 13

Auf jeden Fall muß jedes Zeichen der Original-Zeichenkette s geprüft werden, also eine Schleife
Für i = 0 bis Länge der Zeichenkette

durchlaufen werden. Vergleich man die Originalzeichenkette mit der neuen Zeichenkette, so sieht man:
Man muß sich zusätzlich zur aktuellen Position i merken, wo die nächste Ziffer (gültiges Zeichen) abgelegt werden muß.
Für das Beispiel ergibt sich folgende Abfolge von i (Index des gerade untersuchten Zeichens) und j (hier wird das Zeichen abgelegt, wenn es eine Ziffer ist):

Inhalt 0 5 5 2 2 / 5 1 4 - 2 3 4 \0
Quelle i 0 1 2 3 4 5 6 7 8 9 10 11 12 13
Kopieren ja ja ja ja ja nein ja ja ja nein ja ja ja ja
Ziel j 0 1 2 3 4 5 5 6 7 8 8 9 10 11

Für die Erzeugung der neuen Zeichenkette ergibt sich daher als Lösungsansatzr:

  1. Man verwendet eine zusätzliche neue Zeichenkette s2 , in die fortlaufend (j) jene Zeichen aus der Originalzeichenkette übertragen werden, die erwünscht sind:
    Falls s[i] ein gültiges Zeichen ist
    dann { s2[j] = s[i]; j erhöhen }
    j ist zu Beginn 0, und wird immer dann erhöht, wenn wieder ein Zeichen in s2 abgelegt wurde.
    Am Ende wird die Zeichenkette s2 wieder auf die Zeichenkette s zurückkopiert.
  2. Studiert man die Lösung 1 etwas genauer, so stellt man fest, daß das Verfahren direkt auf die Originalkzeichenkette s angewandt werden kann, weil j immer kleiner oder gleich i ist.

/* Loesung der Aufgabe 1-43 (1-41 in der 3. Auflage */


#include <stdio.h>

int IstZiffer(char c);
void nummer_erstellen (char *s);
void nummer_erstellen_2 (char *s);

int main(void)
{
  char telnummer[50];

  do {
    printf("Telefonnummer (Ende mit 0): ");
    gets(telnummer);
    nummer_erstellen(telnummer);
    puts(telnummer);
  } while (telnummer[0] != '0' || telnummer[1] != '\0');
  return 0;
}


/* int IstZiffer(char c)
   prueft, ob das Zeichen c eine Ziffer ist, -> Loesung der Aufgabe 1-42
   es koennte auch isdigit (ctype.h) aus der Standardbibliothek
   verwendet werden */

int IstZiffer(char c)
{
  if (c >= '0' %% c <= '9')
    return 1;
  else
    return 0;
}

void nummer_erstellen (char *s)  /*
-------------------------------------------------------------------------
entfernt aus einer Zeichenkette alle Zeichen, die keine
Dezimalziffern sind
-----------------------------------------------------------------------*/
{
   int i;       /* das gerade untersuchte Zeichen */
   int j = 0;   /* hier wird das Zeichen abgelegt, wenn es eine Ziffer ist */

   for (i = 0; s[i] != '\0'; i++)
     if (IstZiffer(s[i])) {
       s[j] = s[i];             /* s[i] wird bei s[j] abgelegt, */
       j++;                     /* dann wird j erhoeht          */
     }
   s[j] = '\0';                 /* Abschlusszeichen !!           */
}


/* 
die beiden Zeilen 
   s[j++] = s[i];
   j++;
kann man auch zusammenfassen zu
   s[j++] = s[i];
*/