Struct Array Elemente über Struct Pointer ändern



  • Ich habe die Aufgabe ein Struct Array mit 3 Elementen zu erstellen und dann über eine Funktion, welche als Übergabeparameter einen Zeiger auf eine Struktur Person erhält, diese Elemente zu ändern und zwar muss ich es mit scanf() machen. Ich habe mal etwas zusammengestrickt, siehe unten.

    Allerdings scheint die Eingabe per scanf() nicht ganz zu funktionieren, nach einem ENTER springt er nicht direkt weiter, sonder will nochmal ein ENTER, also insgesamt zwei Eingaben und zwei ENTER, wieso ist das so?

    Hier der Code:

    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    #include <string.h>
    
    struct Person
    {
       char acFirstname[20];
       char acName[20];
       char acBirthday[11];
    } asEmployee[3];
    
    void setPerson(struct Person *ptr);
    
    int main(void)
    {
       struct Person *ptr = asEmployee;
       setPerson(asEmployee);
       printf("%s\n", asEmployee[0].acFirstname);
       printf("%s\n", asEmployee[0].acName);
       printf("%s\n", asEmployee[0].acBirthday);
       printf("%s\n", asEmployee[1].acFirstname);
       printf("%s\n", asEmployee[1].acName);
       printf("%s\n", asEmployee[1].acBirthday);
       printf("%s\n", asEmployee[2].acFirstname);
       printf("%s\n", asEmployee[2].acName);
       printf("%s\n", asEmployee[2].acBirthday);
    
       return 0;
    }
    
    void setPerson(struct Person *ptr)
    {
       int i;
       for (i = 0; i < 3; i++)
       {
          //strcpy(ptr->acFirstname, "Hans");
          //strcpy(ptr->acName, "Weiser");
          //strcpy(ptr->acBirthday, "1960");
          printf("Vorname: \n");
          scanf("%s\n", ptr->acFirstname);
          fflush(stdin);
          printf("Nachname: \n");
          scanf("%s\n", ptr->acName);
          fflush(stdin);
          printf("Geburtstag: \n");
          scanf("%s\n", ptr->acBirthday);
          fflush(stdin);
          ptr++;
       }  
    }
    


  • Mist ich habe gerade gemerkt, dass ich warum auch immer ein "\n" im scanf() eingebaut habe, das war der Fehler.


  • Mod

    Es ist zwar nicht direkt falsch, aber kannst du mal erklären, was du denkst, was Zeile 11 und 17 machen und warum du das so gemacht hast? Das ist ziemlich ungewöhnlich so (und im weiteren Sinne auch fehleranfällig).



  • Zeile 11 erzeugt 3 Struct Arrays vom Typ Person, in die man sozusagen Daten von 3 Personen packen kann. Zeile 17 erzeugt einen Pointer der auf asEmployee[0] zeigt. Ich würde sehr gerne sehen, wie man es korrekt macht, bin noch Anfänger. Die Aufgabenstellung ist folgende:

    Man soll eine Struktur person deklarieren (firstname, name, birthday). Dann soll in main() ein Array mit 3 Elementen dieses Typs definiert werden. Man muss nun eine Funktion schreiben, die als Übergabeparameter einen Zeiger auf eine Struktur person erhält. In dieser sollen die Elemente der übergebenen Struktur mit scanf() beschrieben werden. Und das gleiche soll man dann nochmal mit einer Funktion machen, die alles mit printf() ausgibt.

    Ich habe mir meine Lösung so zusammengebaut, nachdem ich im Netz ein bisschen geschaut habe, aber man findet wenig dazu. Macht man wohl auch nicht unbedingt.



  • joe_dimaggio schrieb:

    Dann soll in main() ein Array mit 3 Elementen dieses Typs definiert werden.

    Das machst du aber nicht. Du definierst global. Globale Variablen sind Müll.
    fflush(stdin) ist auch Müll.

    #include <stdio.h>
    #include <string.h>
    
    typedef struct
    {
       char acFirstname[20];
       char acName[20];
       char acBirthday[11];
    } Person;
    
    void setPerson(Person *ptr);
    
    int main(void)
    {
       Person asEmployee[3]={0};
       setPerson(asEmployee);
       printf("%s\n", asEmployee[0].acFirstname);
       printf("%s\n", asEmployee[0].acName);
       printf("%s\n", asEmployee[0].acBirthday);
       printf("%s\n", asEmployee[1].acFirstname);
       printf("%s\n", asEmployee[1].acName);
       printf("%s\n", asEmployee[1].acBirthday);
       printf("%s\n", asEmployee[2].acFirstname);
       printf("%s\n", asEmployee[2].acName);
       printf("%s\n", asEmployee[2].acBirthday);
    
       return 0;
    }
    
    void setPerson( Person *ptr)
    {
       int i;
       for (i = 0; i < 3; i++)
       {
          printf("Vorname: ");
          scanf("%19s", ptr[i].acFirstname);
          while(!ferror(stdin)&&!feof(stdin)&&getchar()!='\n');
          printf("Nachname: ");
          scanf("%19s", ptr[i].acName);
          while(!ferror(stdin)&&!feof(stdin)&&getchar()!='\n');
          printf("Geburtstag: ");
          scanf("%10s", ptr[i].acBirthday);
          while(!ferror(stdin)&&!feof(stdin)&&getchar()!='\n');
       }
    }
    

    Aber du hast schon recht, im Netz steht viel Unsinn.
    Genauso ist es aber auch Unsinn, sich anzugewöhnen, sich aus dem Netz was zusammenzusuchen. Man sollte meinen, dafür ist dein Lehrer und der Unterricht da.


Anmelden zum Antworten