C-Kurs/Text processing: Unterschied zwischen den Versionen
(→In-place) |
(→Vorgabe) |
||
| Zeile 19: | Zeile 19: | ||
return write - output; /* == strlen(output) */ | return write - output; /* == strlen(output) */ | ||
case '&': | case '&': | ||
| − | strcpy(write, "&"); | + | strcpy(write, "&"); |
write += 5; | write += 5; | ||
break; | break; | ||
case '<': | case '<': | ||
| − | strcpy(write, "<"); | + | strcpy(write, "&lt;"); |
write += 4; | write += 4; | ||
break; | break; | ||
case '>': | case '>': | ||
| − | strcpy(write, ">"); | + | strcpy(write, "&gt;"); |
write += 4; | write += 4; | ||
break; | break; | ||
case '\'': | case '\'': | ||
| − | strcpy(write, "'"); | + | strcpy(write, "&apos;"); |
write += 6; | write += 6; | ||
break; | break; | ||
case '"': | case '"': | ||
| − | strcpy(write, """); | + | strcpy(write, "&quot;"); |
write += 6; | write += 6; | ||
break; | break; | ||
Version vom 17. September 2009, 01:46 Uhr
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 (ähnlich copy_escape_xml oben) praktisch sein.
Viel Spaß und Erfolg!