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

(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)...“)
 
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!