C-Kurs/Text processing
Inhaltsverzeichnis
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!