Struct-Array



  • Hallo ich habe ein Problem,

    ich habe ein kleines Code geschrieben, in dem er die Anzahl von Kunden abfragt und je vor-und nachnamen einliest. Jedoch gibt er mir immer nur den ersten namen vom kunden aus den rest gibt er mir nicht aus...

    Kann mir einer von euch behilflich sein wo mein fehler ist. Danke

    /*Struct Übung*/

    #include <stdio.h>
    #define MAX 100

    struct Person {
    char vorname[MAX];
    char nachname[MAX];
    };

    struct Person einlesen(int x) {

    struct Person kunde[2];
    int i=0;

    printf("\nBitte Nachnamen vom %i. Kunden eingeben: ",x+1);
    fgets(kunde[x].nachname,MAX,stdin);

    printf("\nBitte Vorname vom %i. Kunden eineben: ",x+1);
    fgets(kunde[x].vorname,MAX,stdin);

    printf("\nkunde2: %c",kunde[1].nachname[1]); //Hier gibt er mir dass zweite wort von meinem zweiten kunden aus!!!

    return *kunde; // Ich glaube mein Denkfehler ist hier
    }

    void ausgeben(struct Person *kunde, int x) {

    printf("\nNachname vom %i. Kunden lautet %s",x+1,kunde[x].nachname);

    }

    int main (void) {

    struct Person kunde[2];
    int anzahl,i=0;

    printf("\nWieviel Kunden moechten Sie einlesen? ");
    scanf("%i",&anzahl);

    while (getchar () != '\n');

    //EINLESEN
    for(i=0;i<anzahl;i++) {

    *kunde = einlesen(i);
    }
    // AUSGEBEN

    for(i=0;i<anzahl;i++) {
    ausgeben(&kunde[i],i);
    }

    return 0;
    }



  • 1. Benutze Code-Tags.
    2. Folgender Code...

    for(i=0;i<anzahl;i++)
        *kunde = einlesen(i);
    

    ...sollte eher so lauten:

    for(i=0;i<anzahl;i++)
        kunde[i] = einlesen(i);
    


  • ich hatte die variante auch ausprobiert funktioniert leider nicht...



  • ich denke dass Problem liegt in der Zeile 25, beim return Wert. Er gibt nur den nachnamen vom 1. kunden zurück...



  • doch natürlich dass ist der Fehler return *kunde enstspricht kunde[0]... Jetzt ist meine Frage wie kann ich denn alles zurück geben...



  • ramazancinardere schrieb:

    doch natürlich dass ist der Fehler return *kunde enstspricht kunde[0]... Jetzt ist meine Frage wie kann ich denn alles zurück geben...

    Warum fragst Du überhaupt in der einlesen()-Funktion die Daten beider Kunden ab? Wenn Du die Funktion für einen Kunden pro Schleifendurchlauf aufrufst, dann sollen auch schließlich nur die Werte dieses einen Kunden abgefragt werden.

    EDIT: vergiss meinen Satz von oben, der entand durch überfliegendes Lesen.

    return kunde[i];
    

    müsste den Fehler beheben.

    EDIT2: wobei du überhaupt nicht einmal einen Wert zurückgeben müsstest, weil das Array der Struktur global ist.



  • dass habe ich auch versucht gehabt - leider kein Erfolg



  • ramazancinardere schrieb:

    dass habe ich auch versucht gehabt - leider kein Erfolg

    wie gesagt, setze deinen Code erstmal zwischen Code-Tags, dann lesen sich A) mehr Leute deinen Code durch und 😎 blickt der Leser besser durch, und überfliegt keine anderen Dinge die schlaggebend sind.



  • eine ganz blöde frage - "code-tags" ??? was sind bzw ist dass??



  • Nachdem ich deinen Code mal kompiliert habe, habe ich jetzt bemerkt, dass meine vorherigen Posts auch Bullsh*t waren. Vergiss die erstmal. :p Das kommt davon, wenn man schlecht-formatierten Code lesen will.

    Ich habe deinen Code mal dementsprechend umgebaut, sodass es funktioniert:

    /*Struct Übung*/
    
    #include <stdio.h>
    #define MAX 100
    
    struct Person {
        char vorname[MAX];
        char nachname[MAX];
    };
    
    void einlesen(struct Person* kunde, int x) {
    
        printf("\nBitte Nachnamen vom %i. Kunden eingeben: ",x+1);
        fgets(kunde->nachname,MAX,stdin);
    
        printf("\nBitte Vorname vom %i. Kunden eineben: ",x+1);
        fgets(kunde->vorname,MAX,stdin);
    }
    
    void ausgeben(struct Person* kunde, int x) {
        printf("\nNachname vom %i. Kunden lautet %s", x+1, kunde->nachname);
    }
    
    int main (void) {
    
        struct Person kunde[2];
        int anzahl=2, i;
    
        for(i=0;i<anzahl;i++)
            einlesen(&kunde[i], i);
    
        for(i=0;i<anzahl;i++)
            ausgeben(&kunde[i], i);
    
        return 0;
    }
    

    Zu den Code-Tags: Kuck mal unter dem " 😡 "-Smiliey, da ist ein Button mit einem "C" in der Mitte abgebildet. Drück auf den Button, und die Frage wird sich von alleine beantworten.



  • [code="c"] Vielen Dank für deine Mühe, hat geklappt!!!
    Jedoch wollte ich wissen wo der Fehler an mein Code war, hmmm also, ich habe fleissig weiter experementiert und habe festgestellt dass das Programm in menem Code, der FUnktion die Daten vom 2. Kunden nicht weitergegeben hat... Woran dass liegen kann



  • Der Fehler liegt in der ausgeben()-Funktion.

    Als Parameter nimmt diese nämlich einen Pointer des Typs struct Person entgegen. Soweit sogut, auch übergeben tust du den Pointer noch richtig, aber warum indexierst Du den Pointer in der Funktion? Es handelt sich schließlich nicht um ein Array, sondern um einen einzigen Kunden. Bei kunde[0] macht das noch keinen Unterschied und alles wird korrekt ausgegeben, aber alles andere: Undefined behaviour.

    Statt einem kunde[x].nachname hättest Du halt ein kunde->nachname machen sollen.



  • Alles klar viele Dank jetzt ist es mir auch klar geworden, Dankee nochmals 😃 😃 😃

    ps : dass mit den Code-Tag muss ich mir nochmal genauer anschauen 😃


Log in to reply