Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Dziwne zjawisko dotyczące getchar();

Ostatnio zmodyfikowano 2012-02-24 18:23
Autor Wiadomość
Matti
Temat założony przez niniejszego użytkownika
[C] Dziwne zjawisko dotyczące getchar();
» 2012-02-19 12:29:15
C/C++
#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ę?
P-50966
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:
C/C++
scanf( "%lf", & b );
getchar();
do
{
    //...
} while( /* ... */ );
...i sprawdź, czy działa poprawnie.
P-50969
Matti
Temat założony przez niniejszego użytkownika
» 2012-02-19 15:05:53
http://i41.tinypic.com/20ppq2g.jpg
Tu na screenie widać dalej dziwne zachowania.
P-50988
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.
P-51362
« 1 »
  Strona 1 z 1