Printen eines structs mit Unterprogramm
-
@xniklas27
Das Ausgeben wird schon passen. Nur im else-Zweig hier fehlt noch was:
if ((*s1)-> len == len ) { strcpy ((*s1)->s, s); } else { free ( strNeu ); strNeu = calloc ( len, sizeof (char) ); if ( strNeu ==0 ) { return; } }
-
@xniklas27 sagte in Printen eines structs mit Unterprogramm:
if ( *s1==0 )
Beschreib bitte mal in Worten was Du Dir dabei gedacht hast.OMFG. Ein
typedef
ter Zeiger.
-
@Swordfish sagte in Printen eines structs mit Unterprogramm:
Beschreib bitte mal in Worten was Du Dir dabei gedacht hast.
Das ist ein typedef'ter Zeiger (hast du ja auch schon selbt geko...). Wollte ich auch schon kritisieren.
@xniklas27 Der ganze Code liest sich schwierig, weil
string
ein Zeiger aufstring_t
ist. Würde ich versuchen zu vermeiden.Dann sind da ja relativ viele Fälle in dem "set". Ich würde zu jedem einen (kurzen/einzeiligen) Kommentar schreiben. Und die ganze Funktion kommentieren.
Normalerweise würde ich eine
string_create
, einestring_set
und einestring_free
-Funktion erwarten und nicht alles irgendwie zusammen in demset
(das würde dasset
auch deutlich vereinfachen). Wo kommen bei dir immain()
eigentlich s1 und s2 her? Wie sind die initialisiert? Die Initialisierung ist doch so, wenn man alles in einer Funktion hat, irgendwie ein Problem, oder nicht? Denk mal ein bisschen darüber nach.
-
Wo und wie sind denn deine Variablen s1...s5 definiert?
-
@wob sagte in Printen eines structs mit Unterprogramm:
Ich würde zu jedem einen (kurzen/einzeiligen) Kommentar schreiben. Und die ganze Funktion kommentieren.
Ich würd' kürzere Funktionen schreiben die ohne Kommentare auskommen
#include <assert.h> #include <stdbool.h> #include <stddef.h> #include <stdlib.h> #include <stdio.h> #include <string.h> typedef struct { size_t length; size_t capacity; char *data; } string_t; string_t string_create() { string_t str = { .length = 0, .capacity = 0, .data = "" }; return str; } string_t string_create_reserve(size_t capacity) { if (!capacity) return string_create(); string_t str = { .length = 0, .capacity = capacity, .data = calloc(capacity + 1, 1) }; if (!str.data) return string_create(); return str; } string_t string_create_from(char const *src) { assert(src); size_t const src_length = strlen(src); if (!src_length) return string_create(); string_t str = string_create_reserve(src_length); if (!str.capacity) return string_create(); strcpy(str.data, src); str.length = src_length; return str; } void string_delete(string_t *str) { assert(str); if (str->capacity) free(str->data); } bool string_set(string_t *dst, char const *src) { assert(dst); size_t const src_length = strlen(src); if (!src_length) { *dst = string_create(); return true; } if (!dst->capacity) { *dst = string_create_from(src); return dst->capacity != 0; } if (src_length > dst->capacity) { char *tmp_data = realloc(dst->data, src_length + 1); if (!tmp_data) return false; dst->data = tmp_data; dst->capacity = src_length; } strcpy(dst->data, src); dst->length = src_length; return true; } void string_print(string_t *str) { assert(str && str->data); printf("%s", str->data); } int main() { string_t foo = string_create_from("foo"); string_print(&foo); putchar('\n'); if (!string_set(&foo, "Hugoline")) { fputs("string_set() failed :(\n\n", stderr); return EXIT_FAILURE; } string_print(&foo); putchar('\n'); }
-
@xniklas27 sagte in Printen eines structs mit Unterprogramm:
Ein-ehemaliger-Benutzer
Wow. Neuer Rekord?
-
Ich wollte @xniklas27 erstmal kommentieren lassen und dann - ganz pädagogisch sinnvoll(?) - fragen, ob man die kommentierten Blöcke dann in eine Funktion auslagern kann (deswegen auch einzeilige Kommentare). Aber zu spät, der OP hat ja seinen Account gelöscht...
-
@Swordfish sagte in Printen eines structs mit Unterprogramm:
Wow. Neuer Rekord?
Wir leben in Zeiten in denen viele mit Widerspruch nicht mehr umgehen können, und dazu kommt ein ausgeprägter Egoismus sprich man erwartet, dass sich irgend jemand findet, der die Aufgaben für einem löst.
-
Was fehlt dort noch?
Stehe glaube ich grade auf dem Schlauch
-
@Stabilo
Im "if-Zweig" wird der String-Inhalt mitstrcpy
kopiert.
Im "else-Zweig" wird Speicher angefordert - aber dann nix reinkopiert.