fgets wird ignoriert



  • Das erste fgtes in meinem Code wird einfach übergangen. Ich habe nicht due Möglichkeit, einen Vornamen einzugeben. Gibt es da etwas, was ich übersehe?
    LG

    #include <stdio.h>
    #include <stdlib.h>
    /* run this program using the console pauser or add your own getch, system("pause") or input loop */
    #define MAX 30
    
    struct adres {
       char vname[MAX];
       char nname[MAX];
       long PLZ;
       char ort[MAX];
       int geburtsjahr;
    } adressen;
    void eintragErstellen() {
     printf("Vorname      : ");
       fgets(adressen.vname, MAX, stdin);
       printf("Nachname     : ");
       fgets(adressen.nname, MAX, stdin);
       printf("Postleitzahl : ");
       do {
          scanf("%5ld",&adressen.PLZ);
       } while(getchar()!= '\n');
       printf("Wohnort      : ");
       fgets(adressen.ort, MAX, stdin);
       printf("Geburtsjahr  : ");
       do {
          scanf("%4d",&adressen.geburtsjahr);
       } while(getchar()!='\n' );
    
    }
    void menue() {
        int a;
        printf("1 -  Eintragen \n");
        scanf("%d", &a);
    
        switch (a) {
    
            case 1:
                 eintragErstellen();
                break;
    
        }
    
    }
    
    void erstelleDatei() {
        FILE *addresbuch;
        addresbuch = fopen("addresbuch.txt", "w");
    
    }
    
    int main(int argc, char** argv) {
    
        menue();
        return 0;
    }
    


  • Hi,

    das scanf lässt noch die Returntaste im Stream, die wird dann vom fgets gelesen.

    VG Martin



  • Danke. Mit fflush(stdin); direkt dahinter, hat es funktioniert!



  • BoosterBey schrieb:

    Danke. Mit fflush(stdin); direkt dahinter, hat es funktioniert!

    In meiner Dokumentation zu fflush steht aber

    For input streams (and for update streams on which the last operation was input), the behavior is undefined.

    Besser Du änderst das Format von Deinem Scanfaufruf.

    "%d\n"

    VG



  • Oh. Klasse. Dankeschön 🙂


  • Mod

    mgaeckler schrieb:

    Besser Du änderst das Format von Deinem Scanfaufruf.

    "%d\n"

    Achtung, das macht nicht, was du denkst. '\n' in scanf-Formatstrings überspringt beliebige Mengen Whitespace.

    @Threadersteller: Postleitzahlen sind, trotz des Namens, Ziffernfolgen, keine Zahlen. Damit erübrigt sich dann auch die Benutzung von scanf.



  • SeppJ schrieb:

    mgaeckler schrieb:

    Besser Du änderst das Format von Deinem Scanfaufruf.

    "%d\n"

    Achtung, das macht nicht, was du denkst. '\n' in scanf-Formatstrings überspringt beliebige Mengen Whitespace.

    Äh ja stimmt, hab ich nicht weit genug gedacht.
    VG


Anmelden zum Antworten