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

(Vorgabe)
K (verschob „Ckurs/Text processing“ nach „C-Kurs/Text processing“)
 
(3 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 30: Zeile 30:
 
             write += 4;
 
             write += 4;
 
             break;
 
             break;
         case '\'':
+
         case '\'<span></span>':
 
             strcpy(write, "&amp;apos;");
 
             strcpy(write, "&amp;apos;");
 
             write += 6;
 
             write += 6;
Zeile 51: Zeile 51:
  
 
=== Refactoring ===
 
=== Refactoring ===
Extrahiere eine Methode aus den Blöcken mit
+
Extrahiere eine Funktion aus den Blöcken mit
  
 
  strcpy(write, "...");
 
  strcpy(write, "...");
 
  write += ...;
 
  write += ...;
  
um Code Duplication zu reduzieren.  Nutze die Test-Funktion um sicherzustellen, dass der Code nach deinem Refactoring noch funktioniert.
+
um Code-Duplication zu reduzieren.  Nutze die Test-Funktion um sicherzustellen, dass der Code nach deinem Refactoring noch funktioniert.
  
 
=== In-place ===
 
=== In-place ===

Aktuelle Version vom 5. März 2013, 17:37 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, "&amp;");
            write += 5;
            break;
        case '<':
            strcpy(write, "&lt;");
            write += 4;
            break;
        case '>':
            strcpy(write, "&gt;");
            write += 4;
            break;
        case '\'':
            strcpy(write, "&apos;");
            write += 6;
            break;
        case '"':
            strcpy(write, "&quot;");
            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 Funktion 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 (ähnlich copy_escape_xml oben) praktisch sein.


Viel Spaß und Erfolg!