while + getchar() - komunikat pojawia się 2 razy

0

Witam,

Napisałem sobie w ramach treningu taki program, który ma wczytywać znaki od usera - jeśli wpiszę 1 to wyświetlamy jedynkę, jeśli 2, to wyświetlamy 2, jeśli 0 to kończymy, a jeśli cokolwiek innego to po prostu wyświetlamy jeszcze raz menu wyboru. Nie wiem jednak dlaczego, ale menu wyboru zawsze pojawia się 2 razy:

char ch;

    puts("Press 1 to see 1, press 2 to see 2, press 0 to stop :)");

    while ((ch = getchar()) != '0') {
        switch(ch) {

            case '1':
                puts("1");
                break;
            case '2':
                puts("2");
                break;
            default:                
                break;

        }
                puts("Press 1 to see 1, press 2 to see 2, press 0 to stop :)");

    }

    puts("Thank you for using our program!");

Przykładowe wywołanie:

Press 1 to see 1, press 2 to see 2, press 0 to stop :)
1
1
Press 1 to see 1, press 2 to see 2, press 0 to stop :)
Press 1 to see 1, press 2 to see 2, press 0 to stop :)
2
2
Press 1 to see 1, press 2 to see 2, press 0 to stop :)
Press 1 to see 1, press 2 to see 2, press 0 to stop :)
4
Press 1 to see 1, press 2 to see 2, press 0 to stop :)
Press 1 to see 1, press 2 to see 2, press 0 to stop :)
0
Thank you for using our program!

Co tu jest nie tak?

0

Zamień getchar na getch

0

No działa, dzięki, ale dlaczego nie działa z getcharem()? :)

0

Z tego co pamiętam to getchar() wymaga wciśnięcia entera, tak więc pętla wykona się dwa razy: raz za wciśnięciem 1/2/3, drugi za wciśnięciem entera.

0

Rzeczywiście na to wychodzi, ale nie do końca to rozumiem. Funkcja getchar() wczytuje pierwszy ze wpisanych znaków, ale dopiero PO naciśnięciu entera, tak? W takim razie samo wpisanie "1" nie powinno niczego zmienić i rzeczywiście nic nie zmienia, jednak wciśnięcie entera powoduje wyświetlenie 2 komunikatów. Wychodziłoby więc na to, że funkcja pobiera wtedy na raz 1/2/3 i "\n"?

0

dokładnie tak jak napisałeś. Funkcja getchar pobiera jeden znak z wejścia. wprowadzanie danych na wejscie zawsze trzeba zatwierdzic enterem, a wtedy na wejscie laduje zarowno wprowadzony klawisz jak i enter. za pierwszym razem funkcja czeka az wcisniesz klawisz, bo wejscie jest puste, za drugim razem nie czeka bo na wejsciu pozostal jeszcze enter.

0

Nie to żebym się czepiał ale to brzydkie rozwiązanie.
Standard języka C (Draft): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1539.pdf
Funkcja getch() nie należy do standardu języka. Może zatem warto pomyśleć nad innym rozwiązaniem :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0