Dynamischer Speicher und struct - String einlesen



  • Hallo zusammen,

    ich habe folgendes Programm geschrieben:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct
    {
        char* name;
        int alter;
    }person;
    
    void main(void)
    {
        // 1. Programmteil
        // funktioniert einwandfrei
        // temp wird ganz normal eingelesen
        char temp[1000];
        char *meinName;
        int laenge = 0;
    
        int len;
        char puffer[1000];
    
        printf("Name: ");
        gets(temp);
    
        laenge = strlen(temp);
        meinName = (char *) malloc((laenge + 1) * sizeof(char));
        strcpy(meinName, temp);
    
        printf("Mein Name lautet: %s", meinName);
    
        // 2. Programmteil
        // FEHLER
        // Das Einlesen von puffer funktioniert nicht
        person* p;
        p = (person*)malloc(sizeof(person));
    
        printf("\n\nAlter eingeben: ");
        scanf("%d", &p->alter);
        printf("Name eingeben: ");
        gets(puffer);
    
        len = strlen(puffer);
        p->name = (char*) malloc((len+1)*(sizeof(char)));
        strcpy(p->name, puffer);
    
        printf("%s ist %d Jahre alt.\n", p->name, p->alter);
    }
    

    Konsolenausgabe:

    Name: Peter Meier
    Mein Name lautet: Peter Meier

    Alter eingeben: 23
    Name eingeben: ist 23 Jahre alt.

    Ihr seht schon, die Konsole gibt nicht das Gewünschte aus.

    Im ersten Programmteil kann ich ganz normal einen String mit Hilfe von gets() einlesen.
    Im zweiten Programmteil jedoch nicht, dort wird das Einlesen übersprungen.
    Obwohl in beiden Programmteilen der dynamische Speicher identisch verwendet wird, nur dass ich im zweiten Programmteil noch eine Struktur verwende und das Alter eingelesen wird.
    Mit scanf() könnte ich auch einen String einlesen und das Programm würde funktionieren, aber leider liest scanf() ja nur bis zum ersten Leerzeichen ein. Und ich möchte gerne Vorname und Nachname einlesen, d.h. mit Leerzeichen. Im ersten Programmteil hat es ja mit gets() auch funktioniert.

    Ich hoffe ihr könnt mir helfen. Schonmal Danke im voraus!

    EDIT: Ich habe soeben bemerkt, dass es wahrscheinlich daran liegt, dass ich vorher das Alter mit scanf einlese.

    Ich habe das Programm umgeschrieben (jetzt wird erst der Name eingelesen und dann das Alter) und es funktioniert jetzt.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct
    {
        char* name;
        int alter;
    }person;
    
    void main(void)
    {
        // funktioniert einwandfrei
        // temp wird ganz normal eingelesen
        char temp[1000];
        char *meinName;
        int laenge = 0;
    
        int len;
        char puffer[1000];
    
        printf("Name: ");
        gets(temp);
    
        laenge = strlen(temp);
        meinName = (char *) malloc((laenge + 1) * sizeof(char));
        strcpy(meinName, temp);
    
        printf("Mein Name lautet: %s", meinName);
    
        // FEHLER
        // Das Einlesen von puffer funktioniert nicht
        person* p;
        p = (person*)malloc(sizeof(person));
    
        printf("\n\nName eingeben: ");
        gets(puffer);
    
        printf("Alter eingeben: ");
        scanf("%d", &p->alter);
    
        len = strlen(puffer);
        p->name = (char*) malloc((len+1)*(sizeof(char)));
        strcpy(p->name, puffer);
    
        printf("%s ist %d Jahre alt.\n", p->name, p->alter);
    }
    

    Nun ist meine Frage: Woran liegt es, wenn ich erst das Alter einlese und dann den Namen, dass dann ein Fehler kommt?



  • Nach dem scanf stheht noch ein '\n' im Eingabestrom.
    Dies wird vom gets allerdings als Zeilenende genommen und somit bekommst du eine leere Zeile.

    ⚠ Erstmal: kein gets ! ⚠ Niemals mehr ⚠

    Dann kannst du den Tipp aus https://www.c-plusplus.net/forum/p1146014#1146014 nehmen
    oder du nimmst auch scanf mit dem richtigen Formatspecifier.

    scanf(" %999[^\n]", buffer);  // Achte auf das Leerzeichen vor dem %
    


  • Alles klar, vielen Dank!
    Dann werd ich wohl

    scanf(" %999[^\n]", buffer);
    

    verwenden.


Anmelden zum Antworten