Zum Inhalt springen
Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C-Kurs/Text processing: Unterschied zwischen den Versionen

Aus FreitagsrundenWiki
Zeile 62: Zeile 62:
Aus "/usr//bin///env" soll "/usr/bin/env" werden.
Aus "/usr//bin///env" soll "/usr/bin/env" werden.


Da die Strings dabei nicht länger werden können, bietet sich hier an "in place", also auf demselben String zu arbeiten.
Da die Strings dabei nicht länger werden können, bietet sich hier an, "in place" (auf demselben String) zu arbeiten.<br>
Der Prototyp sollte sein:
Der Prototyp von <tt>single_slashes</tt> sollte sein:


  void single_slashes(char *input_output);
  void single_slashes(char *input_output);

Version vom 16. September 2009, 04:03 Uhr

Vorgabe

Folgender Code zum Escaping von XML ist gegeben:

#include <assert.h>
#include <string.h>

int
copy_escape_xml(char *output, const char *input) {
    const char *read = input;
    char *write = output;

    assert(input != NULL);
    assert(output != NULL);

    for (;;) {
        switch (read[0]) {
        case '\0':
            write[0] = '\0';
            return write - output;  /* == strlen(output) */
        case '&':
            strcpy(write, "&");
            write += 5;
            break;
        case '<':
            strcpy(write, "<");
            write += 4;
            break;
        case '>':
            strcpy(write, ">");
            write += 4;
            break;
        case '\:
            strcpy(write, "'");
            write += 6;
            break;
        case '"':
            strcpy(write, """);
            write += 6;
            break;
        default:
            *(write++) = read[0];
        }
        read++;
    }
}

Aufgaben

Anwendung

Finde heraus, was die Funktion copy_escape_xml aus dem String "Kernighan & Ritchie" macht und schreibe eine Test-Funktion für diesen Fall.

Refactoring

Extrahiere eine Methode aus den Blöcken mit

strcpy(write, "...");
write += ...;

um Code Duplication zu reduzieren. Nutze die Test-Funktion um sicherzustellen, dass der Code nach deinem Refactoring noch funktioniert.

In-place

Schreibe eine Methode single_slashes, die Folgen von Schrägstrichen durch einzelne Schrägstriche ersetzt. Aus "/usr//bin///env" soll "/usr/bin/env" werden.

Da die Strings dabei nicht länger werden können, bietet sich hier an, "in place" (auf demselben String) zu arbeiten.
Der Prototyp von single_slashes sollte sein:

void single_slashes(char *input_output);

Auch hier kann die Verwendung von Lese- und Schreibköpfen (wie oben) praktisch sein.


Viel Spaß und Erfolg!