fgets liest erstes zeichen nicht ein?



  • Hey,

    normalerweise lese ich meine strings immer mit fgets ein und das funktioniert auch ganz prima.
    Manchmal kommt es aber vor, dass das erste Zeichen nicht eingelesen wird.
    Wenn ich es anschließend ausgebe sehe ich das ja.

    Das führt z.B. zu solchen problemen:

    printf("\nWollen sie die Datei mit all ihren Tasks wirklich LOESCHEN?? (y/n) > ");
        fgets(abfrage, 3, stdin);
    
        /* If Abfragen... */
    
        if(*abfrage == 'n')
        {
            printf("\nNicht loeschen! Kehre zum Hauptmenue zurueck!! ");
    
        }
    

    Wenn ich da "n" eingebe gibt er mir nicht das was bei "n" kommen sollte, mach ich "whitespace+n" dann erkennt er das n... 😕

    Hoffe ihr könnt mir helfen, lg, hanshiro



  • Wahrscheinlich ist noch ein Newline-Zeichen '\n' im Eingabepuffer, und dann liest fgets quasi eine leere Zeile.
    Probier mal:

    do
    {
      fgets(abfrage, 3, stdin);
    }while(*abfrage == '\n');
    

    Edit: der dümmste Fehler der C Programmierer passiert selbst mir -)



  • Hey,

    also du meintest bestimmt

    do{...}while(*abfrage == '\n');
    

    und nicht = '\n'.

    mit "==" geht es, aber ich verstehe es nicht ganz...
    Ich prüfe auf einem Newline Zeichen in dem String in den 'n' oder 'y' an abfrage[0] soll, aber da ist doch durch diese abfrage nun ein '\n' oder?

    Vielen Dank schonmal. 🙂



  • Warum für y oder n 3 Zeichen eingelesen werden sollen, weiss ich nicht.

    Jedenfalls schreib ein

    while(getchar() != '\n');

    hinter

    fgets(),

    das löst dein Problem.



  • Davon bin ich auch ausgegangen allerdings funktioniert das nicht.
    Bevor ich gepostet hatte habe ich auch diese Lösung angewandt.

    Dann wird aber z.B. ein fgets überpsrungen, offensichtlich deshalb weil noch ein '\n' im Puffer ist!?

    mit do{...]while(*abfrage == '\n') geht es hingegen wunderbar. :|

    Aber gerade da wird doch eigentlich geprüft das im String an Stelle [0] ein '\n' vorhanden ist!? Wenn nicht sollte es ja abbrechen?

    Ich sollte vielleicht erwähnen das ich unter Linux entwickle.
    Deshalb kann ich auch nicht fflush verwenden. 😞

    Vielen Dank schonmal

    PS: Das mit den 3 Zeichen habe ich als Vorsichtsmaßnahme gewählt.
    Wenn ich fgets 3 gebe ist doch Platz für "y\n\0" oder? Ich habe durch einen Test festegestellt das fgets bei zu wenig Platz auch das '\n' weglässt, aber wie siehts mit dem '\0' aus?



  • ~hanshiro schrieb:

    Ich sollte vielleicht erwähnen das ich unter Linux entwickle.
    Deshalb kann ich auch nicht fflush verwenden. 😞

    gibt's 'fflush' nicht unter linux? 😮



  • no 😞



  • ~hanshiro schrieb:

    no 😞

    was fürn Blödsinn. fflush ist eine Funktion, die im ANSI C definiert ist, demnach ist sie unter alle POSIX Systemen zu finden.

    Was nicht geht ist mit fflush(stdin) den Standardinput Buffer zu leeren, weil das eine Windows Erweiterung ist.



  • Okay, vielen Dank!
    Kannst du mir sagen wie ich dann diesen Puffer löschen kann?

    mfg, hanshiro



  • Kann mir da keiner helfen?
    Habe das Problem immernoch. 😞



  • ~hanshiro schrieb:

    Okay, vielen Dank!
    Kannst du mir sagen wie ich dann diesen Puffer löschen kann?

    mfg, hanshiro

    siehe

    Zeh Mau schrieb:

    Warum für y oder n 3 Zeichen eingelesen werden sollen, weiss ich nicht.

    Jedenfalls schreib ein

    while(getchar() != '\n');

    hinter

    fgets(),

    das löst dein Problem.



  • Daraufhin schrieb ich

    Davon bin ich auch ausgegangen allerdings funktioniert das nicht.
    Bevor ich gepostet hatte habe ich auch diese Lösung angewandt.

    Dann wird aber z.B. ein fgets überpsrungen, offensichtlich deshalb weil noch ein '\n' im Puffer ist!?

    mit do{...}while(*abfrage == '\n') geht es hingegen wunderbar. :|

    Aber gerade da wird doch eigentlich geprüft das im String an Stelle [0] ein '\n' vorhanden ist!? Wenn nicht sollte es ja abbrechen?

    Ich sollte vielleicht erwähnen das ich unter Linux entwickle.



  • das würd ich mal an deiner stelle debuggen( also den inhalt der variablen nach jedem programmschritt mal gründlich angucken ) 😉
    oder poste doch den quellcode hier,
    eildieweil die hellseher recht rar sind und so



  • ei gucke mal was ich hier noch gefunden haaaaaab:

    void clearbuf()
    {
    	setvbuf(stdin,NULL,_IONBF,0);
        setvbuf(stdin,NULL,_IOFBF,BUFSIZ);
    }
    

    mfg
    kläff kläff


Anmelden zum Antworten