problem mit char-abfrage



  • Hi,
    ich wollte in ein kleines Praktikumsprogramm am Ende eine char-Abfrage für einen erneuten Durchlauf einbauen. Allerdings beendet er immer das Programm ohne den scanf Befehl auszuführen. Ich hab es auch schon mit int-Variablen probiert und es geht alles wunderbar. Nur bei char scheint es, als ob er die zeile einfach ignoriert. Es ist eigentlich auch nicht so wichtig, aber sowas wurmt mich einfach...

    Vielen Dank

    #include <stdio.h>
    
    main()
    {
    int    x; 
    char c;
    
    do
    {
    printf ("\nEingabe x:");
    scanf ("%d", &x);
    printf ("\nx=%d", x);
    
    printf ("\n\nErneuter Durchlauf? j/n:");
    
    scanf  ("%c", &c);          /*Problemzeile!*/                
    
    }
    while (c=='j');
    
    printf ("\n\n\n");
    system ("PAUSE");
    return 0;
    }
    

    (editiert)



  • reduziere bitte dein programm. ich habe vor, den beantworteten thread in die FAQs zu verschieben.



  • Schreib das mal so. Dann gehts.

    printf ("Das Ergebnis ist %f", z);
    printf ("\n\nErneuter Durchlauf? j/n:");
    
    fflush(stdin);
    scanf  ("%c", &c);           /*<--------- Das ist der Übeltäter!*/
    

    Löscht den Tastaturspeicher.



  • Frido1982 schrieb:

    fflush(stdin);

    Das sollte aber so nicht in den FAQ landen 🙄



  • @Frido: "fflush(stdin);" ist nicht vom Standard erlaubt und funktioniert nur bei ausgewählten Compilern. Um den Eingabepuffer auszuräumen, benötigt man so etwas:

    while(fgetc(stdin)!='\n');
    

    Wenn du willst, pack dir das in eine Funktion:

    void fignore(FILE* fin,char lim)
    //ignoriert alle Zeichen aus fin, bis es auf lim trifft
    {
      while(fgetc(fin)!=lim);
    }
    
    //Aufruf:
    fignore(stdin,'\n');
    


  • c.rackwitz schrieb:

    reduziere bitte dein programm. ich habe vor, den beantworteten thread in die FAQs zu verschieben.

    Ich hätte das Porgramm vorher schon reduziet, aber ich hab keine Ahnung worin das Problem liegt. (Ich weiß nicht was ich weglassen kann und was nicht.)
    Es gibt ja auch Lösungsen (wofür ich dankbar bin :)), aber ich würde gerne wissen wodurch das Problem überhaupt zustande kommt. Was hat es denn mit diesem Eingabepuffer auf sich? Ich bin da leider noch nicht so bewandert.



  • Definition Eingabepuffer: Eine Region im Speicher für
    die temporäre Speicherung von bereits gelesenen aber noch nicht
    verarbeiteten Daten:
    - Anstatt ein Byte nach dem anderen von dem Eingabegerät zu lesen,
    werden zunächst eine große Anzahl von Bytes gleichzeitig in den
    Puffer gelesen,
    - Diese werden dann stückweise bei jeder Lese-Operation ins
    Programm transferiert.

    Quelle

    d.h., dein Programm denkt, du hättest schon was eingegeben, weil noch Daten im Puffer sind...



  • Aber wie kann das Programm Daten einlesen die noch garnicht eingegeben sind? In diesem Fall ist doch das einzigste Eingabegerät die Tastatur (oder nicht?).
    Ich verstehe das problem immer noch nicht tut mir leid. Ich verstehe in diesem fall auch nicht, warum es mit einer integer-variablen geht und mit einer char-variablen nicht. Um mir zu Helfen müsst ihr leider noch ein paar Gänge runterschalten. 😉

    Danke, trotzdem noch mal.



  • scanf liest nur den Wert ein, der beim Format angegeben ist, %c bei dir. Doch da du enter drückst um die Eingabe abzuschließen, wird nur das Zeichen gespeichert, nicht aber newline (\n). Da es noch im Puffer ist, wird es beim nächsten scanf gleich genommen und somit "übersprungen". Alternativ kann man das mit fgets umgehen, was \n mit einliest.



  • 😮 Das ist ja heftig! Und ich nehme an, bei integer treten da keine Probleme auf, da er "\n" nicht als int-variable erkennt.

    Auf jeden Fall danke für die Hilfe. 🙂

    P.S: Die Zeile von CStoll funktioniert wunderbar.


Anmelden zum Antworten