String als struct mit Funktionen, jedoch wird mit (null) ausgegeben
-
@wob Das ist bis auf ein paar Variablennamen in
set()
1:1 der selbe Code ...
-
Ja genau der ist vorgegeben, man darf aber die set Funktion ändern.
-
@wob ja habe es gerade gesehen, danke dir aber kenn ihn nicht.
-
@Stabilo sagte in String als struct mit Funktionen, jedoch wird mit (null) ausgegeben:
Ja genau der ist vorgegeben, man darf aber die set Funktion ändern.
Dann zeig bitte den vorgegebenen Code so wie Du ihn bekommen hast ohne Änderungen und die genaue Aufgabenstellung.
-
Der vorgegebene Code ist 1zu1 genauso, nur die set Funktion nicht, bei der steht nur:
void set (string* s1, char *s);
Aufgabe von der set Funktion soll sein, die Strings (Speicherplatz) dynamisch zu verwalten.
-
#include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { size_t len; char *s; } *string; // don't do that! void set(string *s1, char *s) { assert(s1); // sanity check if (!(*s1)) { // string doesn't exist -> create *s1 = calloc(1, sizeof(**s1)); // reserve memory and set zero if (!(*s1)) // calloc failed -> bail out return; } if (!s) s = ""; // assume empty string free((*s1)->s); size_t length = strlen(s); (*s1)->s = malloc(length + 1); if (!(*s1)->s) // malloc failed -> bail out return; strcpy((*s1)->s, s); (*s1)->len = length; } void copy(string* s1, string s2) { assert(s1 && s2); set(s1, s2->s); // copy == set } void print(string s1) { printf("%s", s1->s); } void free_string(string *s1) { assert(s1); if (!(*s1)) return; free((*s1)->s); free(*s1); } int main() { string s1 = NULL, s2 = NULL, s3 = NULL, s4 = NULL, s5 = NULL; setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); puts("==============Testen von set() und copy()==========="); set(&s1, NULL); set(&s2, "Hallo Welt!"); set(&s3, "Killroy is watching you!"); copy(&s4, s2); copy(&s5, s3); print(s1); print(s2); print(s3); print(s4); print(s5); // free memory! free_string(&s5); free_string(&s4); free_string(&s3); free_string(&s2); free_string(&s1); }
-
@Swordfish
Danke dir, hast mir echt sehr weiter geholfen.
Hätte nur eine frage zu einem Befehl, was genau macht "assert" ?
-
@Stabilo
assert
prüft die Übergebene Bedingung.
Wenn diese 0 (falsch) ist, wird das Programm mit einer Meldung abgebrochen.http://www.cplusplus.com/reference/cassert/assert/?kw=assert
-
Aber nur im Debug-Modus. Daher sollte das Programm dann zuerst im Debug-Modus getestet werden, bevor eine Release-Version davon veröffentlicht wird (besser wären natürlich noch zusätzliche Unit-Tests, welche auch im Release-Modus ausgeführt werden).
-