[C] Dziwne zjawisko dotyczące getchar();
Ostatnio zmodyfikowano 2012-02-24 18:23
Matti Temat założony przez niniejszego użytkownika |
[C] Dziwne zjawisko dotyczące getchar(); » 2012-02-19 12:29:15 #include <stdio.h>
main() { double a, b; char znak; while( 1 ) { printf( "\nPodaj dwie liczby rzeczywiste.\n" ); printf( " x == " ); scanf( "%lf", & a ); printf( " y == " ); scanf( "%lf", & b ); do { printf( "Podaj dzialanie (+ - *): " ); znak = getche(); printf( "\n" ); } while(( znak != '+' ) &&( znak != '-' ) &&( znak != '*' ) ); switch( znak ) { case '*': { printf( "\n\n %f * %f == %f\n", a, b, a * b ); break; } case '-': { printf( "\n\n %f - %f == %f\n", a, b, a - b ); break; } case '+': { printf( "\n\n %f + %f == %f\n", a, b, a + b ); break; } } } }
Wiele się nie chcę rozpisywać, dlatego krótko. Zmieniam znak = getche(); na znak = getchar(); i program zaczyna wariować. Zamiast pobierać mi z klawiatury dla zmiennej znak, to on ignoruje funkcję getchar i wchodzi drugi raz do pętli, po czym nagle stwierdza, że funkcja getchar tam istnieje. Czyli pierwsze przejście przez pętlę jest jakby "martwe". Ktoś zna tego przyczynę? |
|
malan |
» 2012-02-19 13:00:07 Wydaje mi się, że po prostu coś jest jeszcze w buforze i dlatego Ci "przeskakuje". Zrób tak: scanf( "%lf", & b ); getchar(); do { } while( ); ...i sprawdź, czy działa poprawnie. |
|
Matti Temat założony przez niniejszego użytkownika |
» 2012-02-19 15:05:53 |
|
unimator |
getchar() » 2012-02-24 18:23:57 Wydaje mi się, że jak wciskasz <znak> a potem <enter> i one trafiają na stos/stertę czy inne cudo, to potem są interpretowane w odwrotnej kolejności niż zostały wysłane. Tak więc wpierw będzie interpretowany znak nowej linii a potem ten, który wybrałeś. Rozwiązanie jest dość proste, bo wystarczy wstawić samą funkcję getchar(); przed znak = getchar(); . Można jeszcze lepiej - użyć funkcji getch() (wymaga dołączenia bibl. conio.h). Dzięki temu użytkownik nie będzie musiał wciskać entera po wybraniu znaku co jest bardziej naturalne dla kalkulatora. |
|
« 1 » |