?
Naja, wie könnte man denn damit anfangen? Man überlegt sich wie man so einen String abbilden kann. Welche Informationen benötigt man, um die gewünschten Operationen anbieten zu können?
Mal einfach in den Raum geworfen:
typedef struct String String;
struct String {
char *buf; // die Basisadresse deines Puffers
size_t len; // die aktuelle Länge des Strings
size_t cap; // Anzahl allokierter (aber nicht zwingend genutzer) Bytes
};
So in etwa könnte deine Datenstruktur aussehen. Wenn dir typedef noch nichts sagt, kannst du die entsprechende Zeile einfach weglassen, musst dann aber anstatt "String" immer "struct String" schreiben. Oder du forscht einfach mal nach, was es damit auf sich hat.
Als erstes könntest du dir dann mal Funktionen schreiben die dir so einen String erstellen und wieder löschen. Die könnten (müssen aber nicht) so aussehen:
String *str_new(void); // erstellt einen leeren String
String *str_newinit(const char *s); // erstellt einen String und initialisiert ihn mit s
void str_free(String*); // gibt einen String wieder frei
Überleg dir mal, wie du diese Funktionen implementieren könntest. Wenn du soweit bist, kannst du an die Realisierung üblicher Stringoperationen für deinen Stringtypen nachdenken. Ziel ist es letztendlich, dass man deinen String für gängige Aufgaben benutzen kann, indem man von dir geschriebene Funktionen aufruft. Der Benutzer deiner Library sollte nicht dazu gezwungen sein, auf die einzelnen Elemente deiner Struktur zuzugreifen.