scanf() problem :(



  • hey, also ich hasse diese funktion schön langsam. was die immer für probleme hat, weiss ich echt nich...

    und zwar kann man nicht 2x hintereinander scanf() auf einen char anwenden:

    char c1;
    char c2;
    
    scanf("%c",&c1);     // geht, der curser bleibt hängen und wartet auf eingabe
    scanf("%c",&c2);     // geht nicht, das programm springt sofort weiter..
    

    es liegt wohl an dem '\n', dass beim enter drücken vom ersten scanf-aufruf mitgenommen wird. das wendet er dann scheinbar sofort auf das zweite an oder so (wobei ein ENTER normalerweise nur ein zeilensprung in der shell bewirkt, jedoch scanf TROTZDEM noch auf eingabe wartet)

    also ganz strange... wie kann ich das denn jetzt lösen?



  • das Problem beim scand ist, dass Zeichen im puffer bleiben, und wenn sie nicht vom Leseformat abgedeckt werden, dann bleiben sie eben im Puffer. Beim nächsten scanf liest sie zuerst vom Puffer und dann von stdin, was dazu führt, dass manchmal zwei scanf Aufrufe hintereinanader nicht das gewünschte Ergebnis lieferen.

    Ich finde generell eine schlechte Idee, scanf mit Zeichen bzw. Strings zu verwenden, weil man dann immer mit solchen Sachen konfrontiert wird. Eine solche Frage kommt mindestens einmal in 3 Tagen.

    Deswegen sollte man scanf (zumindest wenn man strings im Format hat) vermeiden und lieber mit fgets eine ganze Zeile einlesen und diese dann gemütlich von mir aus mit sscanf parsen.



  • Wenn du unbedingt scanf() verwenden möchtest, musst du nach jedem Aufruf von scanf(), mit fflush(stdin) den Tastaturpuffer leeren!!

    Dann wirds funktionieren :-)!!

    Grüße MarioTP



  • [quote="MarioTP"]Wenn du unbedingt scanf() verwenden möchtest, musst du nach jedem Aufruf von scanf(), mit fflush(stdin) den Tastaturpuffer leeren!!/quote]

    ⚠ Troll ⚠



  • MarioTP schrieb:

    Wenn du unbedingt scanf() verwenden möchtest, musst du nach jedem Aufruf von scanf(), mit fflush(stdin) den Tastaturpuffer leeren!!

    Dann wirds funktionieren :-)!!

    Grüße MarioTP

    schlechter Witz 😡 siehe http://www.c-plusplus.net/forum/viewtopic-var-t-is-39349.html



  • hey, also ich hab das jetzt mit fgets und gets versucht, aber ich krieg's nicht hin, er springt immer weiter..:

    char temp[5];
    fgets(temp,3,STDIN);
    

    ..nix passiert da, also man kann nichts eingeben.



  • du solltest entwder bei scanf oder fgets bleiben. Am besten gets lieber nicht benutzen, weil man buffer overflows produzieren kann.

    ..nix passiert da, also man kann nichts eingeben

    abgesehen von STDIN (es heißt übrigens stdin und nicht STDIN) ist der Code korrekt. Warum es bei dir nicht geht, keine Ahnung, ich kenn deinen Code nicht.


Anmelden zum Antworten