scanf rauscht durch trotz fflush(stdin)



  • hi,

    ich steuere eine Schleife zur Erfassung von Datensätzen über ein scanf wo ein char eingelesen wird, anhand dem dann entschieden wird ob weiter gemacht wird oder nicht.

    leider rauscht das programm beim 2ten schleifendurchlauf direkt durch ohne ein char vom user einlesen zu lassen.

    habs mit einem fflush(stdin) probiert, aber ohne erfolg.

    woran könnte das liegen?

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct ADDY_ 
    {
       char name[50];
       char vorw[10];
       char rufnr[15];
    } ADDY;
    
    void einfuegen(ADDY *, int);
    
    int main(int argc, char* argv)
    {
      int count=0; 
      char c;
    
      ADDY a[50]; 
    
      while(1)
      {
        printf("Moechten Sie eine Addresse erfassen?");
        printf("\nJa(J)/Nein(N): "); fflush(stdin); scanf("%c", &c);
        printf("\n");
    
        if(c == 'j' || c == 'J')
        {
         einfuegen(a, count);
         count++;
        }
        else
          break;
    
      }
    
      return 0;
    }
    
    void einfuegen(ADDY a[], int i)
    {
      ADDY temp;
      printf("\nName eingeben: "); scanf("%s",&temp.name);
      printf("\nVorwahl eingeben: "); scanf("%s", &temp.vorw);
      printf("\nTelefonnummer eingeben: "); scanf("%s", &temp.rufnr);
    
      a[i] = temp; 
    }
    




  • relpi schrieb:

    habs mit einem fflush(stdin) probiert, aber ohne erfolg.

    stdin ist doch nicht 'flushbar'. wo solls denn hin?
    probier stattdessen sowas ähnliches:

    {
      int c;
      while ((c = fgetc(stdin)!= EOF) && (c!='\n'));
    }
    

    (ungetestet)
    🙂



  • hmm....

    funktioniert bei mir noch schlechter als vorher

    while(1)
      {
        int c;
    
        printf("Moechten Sie eine Addresse erfassen?");
        printf("\nJa(J)/Nein(N): ");
    
        while ((c = getchar()) != '\n' && c != EOF);
    
        if(c == 'j' || c == 'J')
        {
         einfuegen(a, count);
         count++;
        }
        else
          break;
    
      }
    

    jetzt läuft er mir nicht 1x in die IF-Anweisung rein und bleibt im endloos loop hängen, bis ich die Eingabetaste drücke und dann springt er ganz raus.

    da stand aber auch bei dem text dabei:

    "However, if you call these when there is no data in the input stream, the program will wait until there is, which gives you undesirable results."

    Was mach ich den nu? 😕



  • Du sollst das ja auch nach deinem scanf ausführen und nicht dein scanf damit ersetzen O_o



  • Ja wo ist denn scanf geblieben? Das solltest Du nicht entfernen 😉

    Allerdings machst Du den scanf am besten vor die while-Schleife, und benutzt für den auch eine andere Variable, da Du Dir die Eingabe sonst wieder überschreibst. Als erweiterte Übung kannst Du dann die Schleife mal in eine eigene Funktion packen und diese nach jedem scanf aufrufen...



  • LordJaxom schrieb:

    Als erweiterte Übung kannst Du dann die Schleife mal in eine eigene Funktion packen und diese nach jedem scanf aufrufen...

    Und in Stufe 3 wrappen wir scanf() 😉



  • erstmal dafür sorgen das es funktioniert....dann kann man das immernoch "schön" machen.

    egal, wie ich es drehe und wende, klappt es nicht.

    muss de scanf eigentlich jetzt einen int einlesen oder ein char? ein int oder? der zahlen wert, wird dann ja als ascii zeichen interpretiert?!

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct ADDY_ 
    {
       char name[50];
    } ADDY;
    
    void einfuegen(ADDY *, int);
    
    int main(int argc, char* argv)
    {
      int count=0; 
      char c;
      ADDY a[50]; 
    
      while(1)
      {
        int c;
    
        printf("Moechten Sie eine Addresse erfassen?");
        printf("\nJa(J)/Nein(N): ");
    
        while ((c = getchar()) != '\n' && c != EOF);
        scanf("%i", &c);   
    
        if(c == 'j' || c == 'J')
        {
         einfuegen(a, count);
         count++;
        }
        else
          break;
    
      }
    
      return 0;
    }
    
    void einfuegen(ADDY a[], int i)
    {
      ADDY temp;
      printf("\nName eingeben: "); scanf("%s",&temp.name);
    
      a[i] = temp; 
    }
    


  • feigling schrieb:

    Du sollst das ja auch nach deinem scanf ausführen und nicht dein scanf damit ersetzen O_o

    So und jetzt lesen wir meinen Beitrag nochmal und merken, was wir falsch machen :x



  • feigling schrieb:

    feigling schrieb:

    Du sollst das ja auch nach deinem scanf ausführen und nicht dein scanf damit ersetzen O_o

    So und jetzt lesen wir meinen Beitrag nochmal und merken, was wir falsch machen :x

    kleine änderung, keine Wirkung. es passiert nichts.^^

    nach der eingabe des Buchstaben, rennt er mir, mit (vermutlich dem Carrige-Return) in den else block und verlässt das programm.... 😞



  • relpi schrieb:

    feigling schrieb:

    feigling schrieb:

    Du sollst das ja auch nach deinem scanf ausführen und nicht dein scanf damit ersetzen O_o

    So und jetzt lesen wir meinen Beitrag nochmal und merken, was wir falsch machen :x

    kleine änderung, keine Wirkung. es passiert nichts.^^

    nach der eingabe des Buchstaben, rennt er mir, mit (vermutlich dem Carrige-Return) in den else block und verlässt das programm.... 😞

    er hat die zahl 10 in c drin stehen. Ascii = LineFeed.



  • LordJaxom schrieb:

    Allerdings machst Du den scanf am besten vor die while-Schleife, und benutzt für den auch eine andere Variable, da Du Dir die Eingabe sonst wieder überschreibst.

    Den Teil bitte auch nochmal wiederholen :p

    EDIT: selfquote rox



  • Dir ist schon klar, dass du an zwei Stellen scanf() aufrufst?



  • Tim schrieb:

    Dir ist schon klar, dass du an zwei Stellen scanf() aufrufst?

    ne, ich versteh nicht wieso ich 2 scanf brauchen soll. wenn diese flush-while-konstruktion funktioniert müsste das doch überflüssig sein...?!



  • relpi schrieb:

    ne, ich versteh nicht wieso ich 2 scanf brauchen soll. wenn diese flush-while-konstruktion funktioniert müsste das doch überflüssig sein...?!

    Tim wollte damit sagen Du rufst bereits jetzt scanf an zwei Stellen auf (schau doch mal in Dein eigenes Programm ;)) - demzufolge musst Du auch zweimal in Deinem Programm den Tastaturpuffer leeren, jeweils nach dem scanf.

    Und wie gesagt: In der Schleife nicht unbedingt die Variable verwenden, in die man zuvor eingelesen hat, sonst ist die Wahrscheinlichkeit exorbitant hoch, dass das Ergebnis dabei übernagelt wird.



  • so funktionierts....ihr habt mich etwas kirre gemacht 🙄

    Aber danke, dem irrglauben mit fflush hab ich als "sauberen Weg" beigebracht bekommen.

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct ADDY_ 
    {
       char name[50];
    } ADDY;
    
    void einfuegen(ADDY *, int);
    
    void print();
    
    int main(int argc, char* argv)
    {
      int count=0; 
      char ch;
      ADDY a[50]; 
    
      while(1)
      {
        printf("Moechten Sie eine Addresse erfassen?");
        printf("\nJa(J)/Nein(N): ");
    
        scanf("%c",&ch);
    
        if(ch == 'j' || ch == 'J')
        {
         einfuegen(a, count);
         count++;
        }
        else
        {
          print(a, count);
          break;
        }
    
       //Stdin flushen  
       while ((ch = getchar()) != '\n' && ch != EOF);
    
      }
    
      return 0;
    }
    
    void einfuegen(ADDY a[], int i)
    {
      ADDY temp;
      printf("\nName eingeben: "); scanf("%s",&temp.name);
    
      a[i] = temp; 
    }
    
    void einlesen(int *c)
    {
      printf("Moechten Sie eine Addresse erfassen?");
      printf("\nJa(J)/Nein(N): ");
    
      scanf("%i",c);
    }
    
    void print(ADDY a[], int j)
    {
       int i=0;
       for(i=0; i < j; i++) 
         printf("%s", a[i].name);
    }
    

Anmelden zum Antworten