Sommercampus 2006 :: CStrings


Dieser Kurs vermittelt die richtige Benutzung der String Funktionen und des dynamischen Speichers (malloc/free) unter C. Für C Anfänger ist es besonders verwirrend, wenn man mit den C Strings arbeiten muss, die Folge sind jede Menge Bugs, segmentation faults oder gar nicht kompilierte Sources.

Obwohl C mittlerweile von C++ oder anderen objektorientierten Sprachen (wie Java) nach und nach verdrängt wird, hat man manchmal keine andere Wahl als C zu benutzen. C wird vor allem in der Unix Systemprogrammierung oder Hardware Programmierung benutzt.

C hat "mehr Macht" ¨ber den Speicher als andere Sprachen, da man sehr nah am Speicher arbeiten kann, aber mit der Macht kommt auch die Verantwortung und wenn man nicht sorgfältig mit dem (dynamischen/freien) Speicher umgeht, kann das zu einer Quelle von Bugs und Problemen führen, die schwer herauszufinden sind. Deswegen ist es notwendig die Gundlagen genau zu verstehen, um sichere Anwendungen zu schreiben, die weder Speicher verschwenden noch schlimme Bugs enthalten. Gerade für Hardware Programmierer ist das wichtig, damit man sichere Software für die Hardware schreiben kann.

Sprachen wie C++/Java/C#/usw. haben bequeme Klassen zur String Behandlung, C dagegen nicht. Für C Einsteiger kann es deswegen sehr schwer sein, weil man mit den Strings anders umgehen muss, als man es gewohnt ist. Dieser Kurs geht speziell auf die richtige Verwendung der C Strings und des dynamischen Speichers ein. Am Ende des Kurses werden wir eine kleine Bibliothek schreiben, die die Arbeit mit den C Strings erleichtern wird. Der Kurs ist in 3 Tagen unterteilt.

Wir werden mit ANSI C arbeiten, das bedeutet, dass der Inhalt dieses Kurses Betriebsystem-unabhängig ist und die Beispiele und Übungen sowohl unter Windows als auch unter einem Unix Derivat kompiliert werden können. Im Kurs werde ich aber die Beispiele mit dem GNU GCC kompilieren.

Tag 1

Tag 2

Tag 3

SommerCampus Strings Projekte sc-strings

Dowload: sc_strings-0.0.1.tar.gz [301K]

GNU GCC Linker Option: -lsc_strings

Installation

Installation
$ tar xpzf sc_strings-0.0.1.tar.gz
$ cd sc_strings-0.0.1
$ ./configure --prefix=/usr
$ make && make install

Beispiel

C Code: test.c
/* test.c */
 
#include <stdio.h> /* printf */
#include <sc_strings.h>
 
int main(void)
{
    sc_strings *str1, *str2;
 
    str1 = sc_strings_new("                Hallo");
 
    if(!str1)
    {
        fprintf(stderr, "Keinen Speicher mehr\n");
        return 1;
    }
 
    str2 = sc_strings_new("Welt                         ");
 
    if(!str2)
    {
        fprintf(stderr, "Keinen Speicher mehr\n");
        sc_strings_free(str1, 0);
        return 1;
    }
 
    if(!sc_strings_append_c_string(str1, " "))
        fprintf(stderr, "Das Leerezeichen konnte nicht angehängt werden\n");
 
    if(!sc_strings_append(str1, str2))
        fprintf(stderr, "str2 konnte nicht angehängt werden\n");
        
 
    printf("Ergebnis: \"%s\"\n", str1->str);
 
    if(!sc_string_trim(str1))
        fprintf(stderr, "Die leere Zeichen konnten nicht gelöscht werden\n");
 
    printf("Ergebnis: \"%s\"\n", str1->str);
 
    if(!sc_strings_replace_c_string(str1, "Welt", "Pablo!"))
        fprintf(stderr, "Welt konnte nicht durch Pablo! ersetzt werden\n");
 
    printf("Ergebnis: \"%s\"\n", str1->str);
 
    sc_strings_free(str1, 0);
    sc_strings_free(str2, 0);
 
    return 0;
}

Ausführung
supertux@supertux:~> gcc -otest test.c -lsc_strings
supertux@supertux:~> ./test 
Ergebnis: "                Hallo Welt                         "
Ergebnis: "Hallo Welt"
Ergebnis: "Hallo Pablo!"
supertux@supertux:~> valgrind ./test
==14527== Memcheck, a memory error detector.
==14527== Copyright (C) 2002-2006, and GNU GPLd, by Julian Seward et al.
==14527== Using LibVEX rev 1606, a library for dynamic binary translation.
==14527== Copyright (C) 2004-2006, and GNU GPLd, by OpenWorks LLP.
==14527== Using valgrind-3.2.0, a dynamic binary instrumentation framework.
==14527== Copyright (C) 2000-2006, and GNU GPLd, by Julian Seward et al.
==14527== For more details, rerun with: -v
==14527== 
Ergebnis: "                Hallo Welt                         "
Ergebnis: "Hallo Welt"
Ergebnis: "Hallo Pablo!"
==14527== 
==14527== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 1)
==14527== malloc/free: in use at exit: 0 bytes in 0 blocks.
==14527== malloc/free: 6 allocs, 6 frees, 151 bytes allocated.
==14527== For counts of detected errors, rerun with: -v
==14527== All heap blocks were freed -- no leaks are possible.

Valid XHTML 1.0 Strict   Valid CSS!