C und Strings
-
Hallo,
wir lernen in der Schule grade C und sollen eine eigene String-Lib erstellen
Nur leider weiß ich überhaupt nicht wie so eine String-Lib aufgebaut ist, und wir sollen den String kopieren und löschen können ... Nachdem was ich gefunden habe ist ein String wohl nur eine Ansammlung von chars, richtig?LG
-
Wechler schrieb:
Nur leider weiß ich überhaupt nicht wie so eine String-Lib aufgebaut ist
Eine Sammlung von Funktionen wie z.B die aus der C-Standardlibrary: http://www.cplusplus.com/reference/cstring/
Wechler schrieb:
, und wir sollen den String kopieren und löschen können ...
Ok.
Länge ermitteln auch?Wechler schrieb:
Nachdem was ich gefunden habe ist ein String wohl nur eine Ansammlung von chars, richtig?
Ja.
Allerdings liegen die hintereinander im Speicher (z.B. als Array) und sind mit einem Endezeichen gekennzeichnet.
-
1. Schonmal Danke für den Link
2. Für ne bessere Note...
3. Stimmt mit \0
-
Wechler schrieb:
2. Für ne bessere Note...
Da wäre die Implementierungin in Pointer-Schreibweise auch nicht schlecht.
Wechler schrieb:
3. Stimmt mit \0
0 oder '\0'
-
Wenn ein String gelöscht werden soll, dann würde ich nicht davon ausgehen, dass das so etwas wie string.h werden soll. Denn da gibt es ja aus gutem Grund keine Funktion zum Löschen. Das soll wohl eher so etwas wie eine Stringklasse aus Sprachen wie C++ oder Java werden, bloß mit den Mitteln von C. Das ist dann natürlich schon reichlich anspruchsvoll, besonders wenn man gar keine Ahnung hat, was man machen soll.
-
Hasst du schon Recht, aber ich will mir auch nicht meine Note versauen...
-
hmm ja finde ich auch anspruchsvoll! was für ne schule/ausbildung is das ? und wie viel habt ihr schon in c gemacht/gelernt?
aber eine interessante aufgabe, sowas hätte ich auch gern mal gehabt:)
-
Eine eigene String-Lib in C, das ist eine interessante Aufgabe.
Du solltest verstehen, was Arrays und Zeiger sind, denn damit wirst Du ständig arbeiten müssen. Ich habe da mal was geschrieben vor Urzeiten: http://henkessoft.de/C++/C/arrays_pointer.htm
-
Ich habe mir das jetzt so gedacht:
1. Man gibt einen Wert ein
2. Die Lib ermittelt die Anzahl der Zeichen
3. Es werden soviele Arrays erstellt wie es Zeichen gibt
4. Jedes Zeichen kommt in eine ArrayKann sowas funktionieren?
-
Wechler schrieb:
Ich habe mir das jetzt so gedacht:
1. Man gibt einen Wert ein
2. Die Lib ermittelt die Anzahl der Zeichen
3. Es werden soviele Arrays erstellt wie es Zeichen gibt
4. Jedes Zeichen kommt in eine ArrayKann sowas funktionieren?
Das ist ziemlicher Unsinn. Lies doch mal selber, was du geschrieben hast, insbesondere zu den Arrays.
Außerdem ein grundsätzliches Problem: Wie ermittelst du denn die Anzahl der Zeichen? Dafür musst du doch bereits die komplette Zeichenkette irgendwo gespeichert haben.Deine Vorgehensweise halte ich zudem für verkehrt. Du willst eine Bibliothek entwerfen. Deine Beschreibung ist ein Programmablaufplan. Bei einer Beschreibung einer Bibliothek würde ich eine Beschreibung der zentralen Datenstrukturen erwarten und der Funktionen, die auf diesen Strukturen arbeiten. Das was du beschreibst ist die Benutzung dieser Bibliothek.
-
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.