Kundendaten einlesen, speichern, suchen, ausgeben



  • Hallo Leute,
    ich bin gerade dabei mir ein kleines C-Programm zu schreiben, welches Kundendaten einlesen, speichern, in einer Datei nach z.B. dem Namen suchen soll und die zugehörigen Daten wiedre ausgeben soll.

    Das einlesen und ausgeben aus einer Variablen funktioniert nun schon.

    Ich möchte euch bitten, mal über meinen Code zu schauen ob es etwas zu verbessern (ganz besonderes Merkmal sollte hier auf Pointern liegen) gibt, da ich noch blutiger Anfänger bin.

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct struktur{
            char Nachname[40];
            char Vorname[30];
            char StrasseundHausnummer[60];
            char PLZ[5];
            char Ort[50];
            char Festnetz[15];
            char Mobil[20];
            char Fax[15];
            char EMail[60];
            char Geburtsdatum[10];
            char Kundennummer[8];
    } kunde;
    
    char kundenEingabe(kunde *k1){
    
         printf("Nachname.................: ");
         scanf("%s", &k1->Nachname);
         fflush(stdin);
    
         printf("Vorname..................: ");
         scanf("%s", &k1->Vorname);
         fflush(stdin);
    
         printf("Strasse und Hausnummer...: ");
         scanf("%s", &k1->StrasseundHausnummer);
         fflush(stdin);
    
         printf("PLZ......................: ");
         scanf("%s", &k1->PLZ);
         fflush(stdin);
    
         printf("Ort......................: ");
         scanf("%s", &k1->Ort);
         fflush(stdin);
    
         printf("Telefon Festnetz.........: ");
         scanf("%s", &k1->Festnetz);
         fflush(stdin);
    
         printf("Telefon Mobil............: ");
         scanf("%s", &k1->Mobil);
         fflush(stdin);
    
         printf("Fax......................: ");
         scanf("%s", &k1->Fax);
         fflush(stdin);
    
         printf("E-Mail...................: ");
         scanf("%s", &k1->EMail);
         fflush(stdin);
    
         printf("Geburtsdatum.............: ");
         scanf("%s", &k1->Geburtsdatum);
         fflush(stdin);
    
         printf("Kundennummer.............: ");
         scanf("%s", &k1->Kundennummer);
         fflush(stdin);
    
         printf("\n");
    }
    
    void kundenAusgabe(kunde k1){
                           printf("Nachname.................: %s\n", &k1.Nachname);
                           printf("Vorname..................: %s\n", &k1.Vorname);
                           printf("Strasse und Hausnummer...: %s\n", &k1.StrasseundHausnummer);
                           printf("PLZ......................: %s\n", &k1.PLZ);
                           printf("Ort......................: %s\n", &k1.Ort);
                           printf("Telefon Festnetz.........: %s\n", &k1.Festnetz);
                           printf("Telefon Mobil............: %s\n", &k1.Mobil);
                           printf("Fax......................: %s\n", &k1.Fax);
                           printf("E-Mail...................: %s\n", &k1.EMail);
                           printf("Geburtsdatum.............: %s\n", &k1.Geburtsdatum);
                           printf("Kundennummer.............: %s\n", &k1.Kundennummer);
                           printf("\n");
    }
    
    int main(int argc, char *argv[]){
    
        kunde k1;
    
        kundenEingabe(&k1);
        kundenAusgabe(k1);
    
        system("PAUSE");
        return 0;
    
    }
    

    Im Vorraus schon mal vielen Dank für eure Hilfe!



  • Das "&" ist unnötig, da ein Pointer bereits eine Adresse ist.

    scanf("%s", k1->Nachname);
    

    Printf benötigt keine Adresse für die Ausgabe, ein value reicht.

    printf("Nachname.................: %s\n", k1.Nachname);
    

    Muss es nicht void heißen, da kein Rückgabewert existiert?

    void kundenEingabe(kunde *k1)
    

    PS: Das mit den festen Char-Arrays ist unlogisch! Eine PLZ ist doch kein char, sondern ein Integer etc. Außerdem musst du verhindern, dass der Benutzer nicht mehr als die Arraygröße schreiben darf.



  • Das wäre mal eine Sache um sich mit Datenbanken auseinander zu setzen. 🙂

    Für den Anfang geht auch sqlite, das kann man mit Firefox (mit Addon SQL-Manager) machen.



  • Ich habe die von dir vorgeschlagenen Änderungen mal angewandt, aber jetzt gibt es folgende Probleme:

    Ich gebe ein:
    ...
    PLZ: 50259
    Ort: Brauweiler
    ...
    Geburtsdatum: 11.08.1991
    Kundennummer: 00000001

    Es wird dann folgendes Ausgegeben:
    ...
    PLZ: 50259Brauweiler
    Ort:Brauweiler
    ...
    Geburtsdatum:11.08.199100000001
    Kundennummer: 00000001

    Woran kann das liegen?
    Müsste der Fehler wenn nicht bei allen Werten auftauchen?

    Hier der aktuelle Code nach den Änderungen:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct struktur{
            char Nachname[40];
            char Vorname[30];
            char StrasseundHausnummer[60];
            char PLZ[5];
            char Ort[50];
            char Festnetz[15];
            char Mobil[20];
            char Fax[15];
            char EMail[60];
            char Geburtsdatum[10];
            char Kundennummer[8];
    } kunde;
    
    void kundenEingabe(kunde *k1){
    
         printf("Nachname.................: ");
         scanf("%s", k1->Nachname);
         fflush(stdin);
    
         printf("Vorname..................: ");
         scanf("%s", k1->Vorname);
         fflush(stdin);
    
         printf("Strasse und Hausnummer...: ");
         scanf("%s", k1->StrasseundHausnummer);
         fflush(stdin);
    
         printf("PLZ......................: ");
         scanf("%s", k1->PLZ);
         fflush(stdin);
    
         printf("Ort......................: ");
         scanf("%s", k1->Ort);
         fflush(stdin);
    
         printf("Telefon Festnetz.........: ");
         scanf("%s", k1->Festnetz);
         fflush(stdin);
    
         printf("Telefon Mobil............: ");
         scanf("%s", k1->Mobil);
         fflush(stdin);
    
         printf("Fax......................: ");
         scanf("%s", k1->Fax);
         fflush(stdin);
    
         printf("E-Mail...................: ");
         scanf("%s", k1->EMail);
         fflush(stdin);
    
         printf("Geburtsdatum.............: ");
         scanf("%s", k1->Geburtsdatum);
         fflush(stdin);
    
         printf("Kundennummer.............: ");
         scanf("%s", k1->Kundennummer);
         fflush(stdin);
    
         printf("\n");
    }
    
    void kundenAusgabe(kunde k1){
                           printf("Nachname.................: %s\n", k1.Nachname);
                           printf("Vorname..................: %s\n", k1.Vorname);
                           printf("Strasse und Hausnummer...: %s\n", k1.StrasseundHausnummer);
                           printf("PLZ......................: %s\n", k1.PLZ);
                           printf("Ort......................: %s\n", k1.Ort);
                           printf("Telefon Festnetz.........: %s\n", k1.Festnetz);
                           printf("Telefon Mobil............: %s\n", k1.Mobil);
                           printf("Fax......................: %s\n", k1.Fax);
                           printf("E-Mail...................: %s\n", k1.EMail);
                           printf("Geburtsdatum.............: %s\n", k1.Geburtsdatum);
                           printf("Kundennummer.............: %s\n", k1.Kundennummer);
                           printf("\n");
    }
    
    int main(int argc, char *argv[]){
    
        kunde k1;
    
        kundenEingabe(&k1);
        kundenAusgabe(k1);
    
        system("PAUSE");
        return 0;
    
    }
    


  • Mach die "&" wieder rein bei scanf... Jeder macht Fehler 😛



  • Es ist gut, wenn du alle Benutzereingaben erstmal als String einliest, dass hält den Code überschaubar.
    fflush(stdin) ist Nichtstandard und Anfängermüll, auch solltest du den Stringlängenbegrenzung von scanf nutzen:
    Statt

    printf("Nachname.................: ");
         scanf("%s", &k1->Nachname);
         fflush(stdin);
    

    also besser:

    printf("Nachname.................: ");
         scanf("%39s", k1->Nachname); while( getchar()!='\n' );
    


  • Auch mit Adressoperatoren im scanf() tritt der Fehler immernoch auf.

    Mich wundert es aber das der Fehler nur bei 2 (immer den gleichen) Arrays auftritt, die anderen aber die korrekten Werte ausgeben.

    Wieso hast du vorgeschlagen beim scanf() den Adressoperator wieder einzufügen, ich fande deine Argumentation dass das k1 ein Pointer und damit auch schon eine Speicheradress ist sehr schlüssig.

    Edit:
    Das Array PLZ hat eine Länge von 5 und Kundennummer von 8.
    Wenn ich die Länge voll ausnutze, d.h. eine 5stellige PLZ und eine 8 Stellige Kundennummer eingebe tritt der Fehler auf.
    Sobald die Eingaben ein Zeichen kürzer sind, tritt der Fehler nicht mehr auf. wtf?
    Muss ich in die Arraylänge noch die ascii 0 einrechnen?

    Ich habe bis jetzt gedacht das Array A[8] würde mir 8 Stellen von 0-7 zur Verfügung stellen und an Position 8 folgt die ascii 0.



  • Wieso hast du vorgeschlagen beim scanf() den Adressoperator wieder einzufügen, ich fande deine Argumentation dass das k1 ein Pointer und damit auch schon eine Speicheradress ist sehr schlüssig.

    Ich kann gerade nicht klar denken... (Kopfschmerzen) und finde es ohne & immer noch richtig lol

    Wenn du 5 Zeichen in PLZ[5] (gilt auch für Geburtstag) reinschreibst, dann gibt es in dem String keine Platz für die '\0' Terminierung und der Folgestring wird mit ausgegeben. Die Begründung für deinen Fehler mit meiner Variante.



  • Du brauchst in deinen Strings noch Platz für das abschließende '\0'

    Also für 5 Zeichen Postleitzahl brauchsst du Platz für 6 Zeichen (C-Grundlagen)
    Das gilt für den Rest genauso.

    Wenn du String einlesen willst, brauchst du kein &.



  • Zu langsam 🙂

    Fishmasta schrieb:

    Ich habe bis jetzt gedacht das Array A[8] würde mir 8 Stellen von 0-7 zur Verfügung stellen und an Position 8 folgt die ascii 0.

    Nein du hast Platz für 8 Zeichen (inkl der 0). Also 7 Zeichen + '\0'

    Es gibt ja auch noch andere Arrays und da will man den Platz nicht verschenken.


Anmelden zum Antworten