Problem mit fgets in Funktion



  • Hallo, ich habe das folgende Problem:

    Wenn ich folgenden Code in meiner main-Funktion aufrufe, funktioniert er wunderbar:

    char puffer[256];
    printf("Bitte Name eingeben und <Eingabe> druecken:\n");
    fgets( puffer,256,stdin );
    printf("\nIhr Name enthält %d Zeichen (inkl. Leerzeichen).", strlen(puffer));
    

    Sobald ich nun aber in einer beliebigen Funktion, z.B. void EigeneFunktion(), fgets, gets, getchar etc. aufrufe wird der Programmaufruf nicht unterbrochen. Das Programm läuft einfach weiter.

    Einzig die Funktion scanf funktioniert! Diese kann ich aber leider nicht einsetzen, da die vom User einzugebene Zeichenkette Leerzeichen enthalten soll und der String ja bei scanf nach dem ersten Leerzeichen einfach abgeschnitten wird.

    Woran kann das liegen und wie kann ich den Fehler beheben? 😕

    (Nutze ein HP-System mit gcc.)

    Anmerkung:
    Wenn ich den fgets-Aufruf zweimal hintereinander tätige, funktioniert es auf einmal...was soll das denn bedeuten???)



  • der Tastatur Buffer ist nicht richtig geleert, dass heisst von irgend einer Einlese Funktion liegt noch ein \n oder so im TastaturSpeicher und das wird von fgets dann gelesen.

    wenn du vorher irgend wo scanf oder andere Eingabe Funktionen benutzt, solltest du sicher stellen, dass diese auch \n einlesen
    scanf("%s\n",...); <-- so zB. bei scanf (ich weiss nicht warum die meisten Tutorials das nicht erklären 😞 )



  • Hi kingruedi,

    danke für deine Antwort!

    Ich habe deinen Lösungsansatz ausprobiert, leider hat es, nachdem ich alle scanf's mit scanf("%s\n",...); ersetzt habe, trotzdem nicht geklappt. Nun musste ich jedesmal die Werte doppelt eingeben und mit Enter bestätigen. (Übrigens hab ich das wirklich in keinem Tutorial gelesen...)

    Dein Tip mit dem gefüllten Eingabepuffer hat mir aber sehr geholfen!
    Ich rufe jetzt nach jedem scanf die folgende Funktion auf:

    void flushstdin()
    {
      char z;
      do
      {
        z=getchar();
      }
      while(z!=10);
    }
    

    So wird das auf die Eingabe folgende Return nicht verarbeitet. 🙂



  • Versuch doch mal ein fflush(stdin) vor jeder Eingabe...



  • derBob schrieb:

    Versuch doch mal ein fflush(stdin) vor jeder Eingabe...

    Ne, das ist undefiniert:
    http://www.c-plusplus.net/forum/viewtopic.php?t=39349&highlight=fflush+stdin+undefiniert

    @Dressman1981:
    Ich hab das jetzt nicht ganz verstanden. Funktioniert dein Programm jetzt oder noch nicht so ganz?!



  • Stimmt, hast recht!

    Das war jetzt echt dumm von mir, so einen undurchdachten Tipp abzugeben! Ich werde das nächste Mal genau überlegen, was ich für Vorschläge mache - schließlich kann man nie wissen, was dieses unkontrollierte fflush(stdin) so alles anrichten kann.
    Wenn ich nur daran denke, wird mir schon übel!

    Danke,danke,danke!

    PS: Danke



  • Sorry, dass ich mich jetzt erst melde.

    Bin auf einem Lehrgang in München.

    Ja mein Programm funktioniert, wie soll! Danke euch allen! 🙂



  • Dressman1981 schrieb:

    Sorry, dass ich mich jetzt erst melde.

    Bin auf einem Lehrgang in München.

    Ja mein Programm funktioniert, wie soll! Danke euch allen! 🙂

    Hoffentlich ohne fflush()...


Anmelden zum Antworten