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
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, "&amp;");
             strcpy(write, "&amp;amp;");
             write += 5;
             write += 5;
             break;
             break;
         case '<':
         case '<':
             strcpy(write, "&lt;");
             strcpy(write, "&amp;lt;");
             write += 4;
             write += 4;
             break;
             break;
         case '>':
         case '>':
             strcpy(write, "&gt;");
             strcpy(write, "&amp;gt;");
             write += 4;
             write += 4;
             break;
             break;
         case '\'':
         case '\'<span></span>':
             strcpy(write, "&apos;");
             strcpy(write, "&amp;apos;");
             write += 6;
             write += 6;
             break;
             break;
         case '"':
         case '"':
             strcpy(write, "&quot;");
             strcpy(write, "&amp;quot;");
             write += 6;
             write += 6;
             break;
             break;
Zeile 46: Zeile 46:


== Aufgaben ==
== Aufgaben ==
Stichwörter sind:
* Call by reference
* Pointer auf Pointer
* Pointer-Arithmetik
Nun zu den Aufgaben:


=== Anwendung ===
=== Anwendung ===
Zeile 57: 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 ===
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", 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);


Auch hier kann die Verwendung von Lese- und Schreibköpfen (wie oben) praktisch sein.
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

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!