C-Kurs/Text processing: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „== Vorgabe == Folgender Code zum Escaping von XML ist gegeben: #include <assert.h> #include <string.h> int copy_escape_xml(char *output, const char *input)...“) |
PaulG (Diskussion | Beiträge) K (verschob „Ckurs/Text processing“ nach „C-Kurs/Text processing“) |
||
(7 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt) | |||
Zeile 19: | Zeile 19: | ||
return write - output; /* == strlen(output) */ | return write - output; /* == strlen(output) */ | ||
case '&': | case '&': | ||
− | strcpy(write, "&"); | + | strcpy(write, "&amp;"); |
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 '\'<span></span>': |
− | strcpy(write, "'"); | + | strcpy(write, "&apos;"); |
write += 6; | write += 6; | ||
break; | break; | ||
case '"': | case '"': | ||
− | strcpy(write, """); | + | strcpy(write, "&quot;"); |
write += 6; | write += 6; | ||
break; | break; | ||
Zeile 46: | Zeile 46: | ||
== Aufgaben == | == Aufgaben == | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
=== Anwendung === | === Anwendung === | ||
Zeile 57: | Zeile 51: | ||
=== Refactoring === | === Refactoring === | ||
− | Extrahiere eine | + | 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 === | ||
Zeile 68: | 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" | + | 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); | ||
− | Auch hier kann die Verwendung von Lese- und Schreibköpfen ( | + | Auch hier kann die Verwendung von Lese- und Schreibköpfen (ähnlich <tt>copy_escape_xml</tt> oben) praktisch sein. |
'''Viel Spaß und Erfolg!''' | '''Viel Spaß und Erfolg!''' |
Aktuelle Version vom 5. März 2013, 17:37 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 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!