Printen eines structs mit Unterprogramm



  • Hallo, ich muss für die Uni ein Programm schreiben und stehe bei einer Sache irgendwie auf dem Schlauch...
    Das Programm set soll den Speicher reservieren und dynamisch verwalten, das geht auch soweit ganz gut.
    Nun möchte ich das Unterprogramm print testen, aber irgendwie printet es einfach nicht. Hat einer eine Idee wie ich das beheben kann???

    typedef struct {
     int len; /* Anzahl Zeichen in s */
     char *s; /* ein C-string mit abschließendem \0-Zeichen */
    } string_t;
    
    typedef string_t* string;
    	
    void set (string* s1, char *s)
    {
        int len = 0;
        string Neu = 0;
        char *strNeu = 0;
    
        if ( s==0 )
        {
            s = "";
        }
        if ( *s1==0 )
        {
            Neu = calloc (sizeof (string_t), sizeof (char));
            if ( Neu==0 )
            {
                return;
            }
            *s1 = Neu;
            (*s1)->s = strNeu;
        }
        len = strlen (s) +1;
    
        if ((*s1)-> len == len )
        {
            strcpy ((*s1)->s, s);
        }
        else
        {
            free ( strNeu );
    
            strNeu = calloc ( len, sizeof (char) );
            if ( strNeu ==0 )
            {
                return;
            }
        }
    }
    void print (string s1){
    printf("%s", s1->s);
    }
    
    #include <stdio.h>
    #include "string.h"
    int main(void)
    {
     set (&s1, NULL);
     set (&s2, "Hallo Welt!");
    
     print (s1);
     print (s2);
     print (s3);
     print (s4);
     print (s5);
    }
    
    
    
    


  • Bitte beim nächsten Mal darauf achten in welchem Forum Du postest. Das C-Forum findest du da drüben: Sonstige Programmiersprachen / C (alle ISO-Standards). Ein Moderator wird Deinen Thread sicher bald verschieben.



  • @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 typedefter 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 auf string_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, eine string_set und eine string_free-Funktion erwarten und nicht alles irgendwie zusammen in dem set (das würde das set auch deutlich vereinfachen). Wo kommen bei dir im main() 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.



  • @hustbaer

    Was fehlt dort noch?
    Stehe glaube ich grade auf dem Schlauch



  • @Stabilo
    Im "if-Zweig" wird der String-Inhalt mit strcpy kopiert.
    Im "else-Zweig" wird Speicher angefordert - aber dann nix reinkopiert.


Log in to reply