Struct speichern und ausgeben



  • Guten abend,
    ich verzweifel hier an einer Aufgabe. Der Code soll einfach name und note in des definierten datentyps speichern. Wissensstand: 1.Semester Informatik.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct
    {
        char nachname[30];
        float note;
    } student;
    
    int main()
    {
    
        int i;
        printf("Wie viele Studenten insgesamt?\n");
        scanf("%d", &i);
    
        student stud1;
        student gruppe[i];
    
        char name[30];
        float note;
        int count=1;
        while(count<=i)
        {
    
            printf("Name:\n");
            scanf("%s", &name);
            printf("Note:\n");
            scanf("%f", &note);
    
            student a = {&name, &note};
            gruppe[count] = a;
            count++;
        }
    
        printf("Studenten:\n");
        int j=1;
        for (j=1; j<=i; j++ )
        {
            printf("%d. %s %f",j, gruppe[j].nachname,gruppe[j].note);
        }
    
        return 0;
    }
    


  • student gruppe[i];
    

    Ist nicht mit allen Compilern kompatibel.
    Nach einem scanf befindet sich noch ein '\n' im Tastenpuffer, dies kannst du mit einem getchar abfangen.
    Wenn du den Tastenpuffer komplett leeren willst, hilft das hier:

    int ch;
    while ((ch = getchar()) != EOF && ch != '\n');
    

    Und wenn du bei der Abfrage keine maximale Länge angibst, kann es zu einem Pufferüberlauf kommen.



  • printf("Name:\n");
    scanf("%s", &name);
    printf("Note:\n");
    scanf("%f", &note)
    

    Macht nicht das was du willst, die Bildschirmausgabe sieht dann so aus:
    Name:
    Note:

    student a = {&name, &note};
    gruppe[count] = a;
    count++;
    

    Das ist Quatsch, und wo ist stud1 geblieben?



  • Mit kleinen Änderungen:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct
    {
        char nachname[30];
        float note;
    } student;
    
    int main()
    {
    
        int i;
        printf("Wie viele Studenten insgesamt?\n");
        scanf("%d", &i);
    
        student gruppe[i];
    
        char name[30];
        float note;
        int count=1;
        while(count<=i)
        {
    
            printf("Name:\n");
            scanf("%s", &name);
            printf("Note:\n");
            scanf("%f", &note);
    
            student a = {.nachname=name, .note=note};
            gruppe[count] = a;
            ++count;
        }
    
        printf("Studenten:\n");
        int j=1;
        for (j=1; j<=i; j++ )
        {
            sprintf("%d. %s %f",j, gruppe[j].nachname,gruppe[j].note);
        }
    
        return 0;
    }
    

    Der Code funktioniert ja soweit, das Problem ist die ausgabe des namens. Wie kann man das machen?



  • Nein der Code funktioniert nicht

    student a = {.nachname=name, .note=note};
    gruppe[count] = a;
    ++count;
    

    ist schrott.
    Und wieso sprintf? Nicht gemerkt, dass deswegen das Programm abschmiert?



  • Eine Empfehlung von mir:
    www.c-howto.de
    lese dir dort das Kapitel über strukturierte Datentypen durch.



  • Der Arrayname (allein) steht schon für die Anfangsadresse vom Array. Du brauchst da also keinen Adressoperator &.

    Zu dem kannst du auch gleich in die struct einlesen:

    scanf(" %s", gruppe[count].nachname);
    scanf("%f", &gruppe[count].note);
    

    Und der Index von Arrays fängt in C bei 0 an. Immer.
    Daher

    int count=0;
    

    Daraus folgt auch, dass der höchste Index Eins weniger ist, als die Angabe bei der Definition.

    An dieser Stelle wäre eine for-Schleife übersichtlicher.

    for (count=0; count<i; count++ )
    { ...
    

    Aussagekräftige Variablennamen würden die Les- und Wartbarkeit auch erhöhen.
    i nimmt man z.B. als Laufvariable für Schleifen.

    Bitmapper schrieb:

    Nach einem scanf befindet sich noch ein '\n' im Tastenpuffer, dies kannst du mit einem getchar abfangen.

    Es reicht auch aus, beim nächsten scanf in den Formatstring ein Leerzeichen einzubauen (allerdings an der richtigen Stelle)



  • @DirkB
    Das stimmt zwar, aber besser man löscht immer den Gesamten Puffer, weil was ist wenn als nächstes kein scanf folgt, sondern man will ein Zeichen mit getchar einlesen?



  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct
    {
        char nachname[30];
        float note;
    } student;
    
    int main()
    {
    
        int i;
        printf("Wie viele Studenten insgesamt?\n");
        scanf("%d", &i);
    
        student gruppe[i];
    
        char name[30];
        float note;
        int count=0;
        for (count=0; count<i; count++ )
        {
    
            printf("Name:\n");
            scanf(" %s", gruppe[count].nachname);
            printf("Note:\n");
            scanf("%f", &gruppe[count].note);
    
        }
    
        printf("Studenten:\n");
        int j=0;
    
        for (j=0; j<=i; j++)
        {           
    
            printf("%s", gruppe[j].nachname);
            printf("%f",  gruppe[j].note);
        }
    
        return 0;
    }
    

    So hats funktioniert danke für eure Hilfe 🙂



  • Du gibst ein Element zuviel aus.


Anmelden zum Antworten