Pętla while, pomijanie wczytywania

0

Mam taki fragment kodu. Jak go skompiluje i uruchomie to kod nie działa tak jak wydaje mi się, że powinien działać. Otóż wypisują się opcje wyboru, następnie dokonuje wyboru 'm' lub 'k' i wyświetla mi się prawidłowo dokonany wybór. Niestety kolejnym razem gdy program wraca do pętli while po prostu pomija wczytywanie chara i wypisuje, że nic nie wybrałem i opcję default ze switcha. Następne przejście pętli jest już prawidłowe, takie dziwne zachowanie pomijające wczytywanie na początku pętli dzieję się za każym razem, jednorazowo po dokonaniu wyboru 'm' lub 'k'. Czy ktoś wie dlaczego tak się dzieje?

import java.io.*;

public class MonetaOrKostka {
    public static void main(String args[]) {
	    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
	    char c='e';
	    System.out.print("m - Moneta \nk - Kostka \nz - Zakoncz\n");
	    while(true) {

			try {
		    	c=(char)reader.read();  //pomija co drugą pętle
			}
			catch(IOException e) { System.out.println("Blad odczytu"); 
			}
			System.out.println("Wybrales: " + c);
			switch(c) {
			case 'z': return;
			case 'm': System.out.println("Rzuczm moneta"); break;
			case 'k': System.out.println("Rzuczm koscia"); break;
			default: System.out.println("Zly wybor, sprobuj ponownie");
			}
	    }
    }
}
 
1

Żeby udzielić odpowiedzi naciskasz dwa klawisze: powiedzmy 'm' i ENTER. Za pierwszym razem odczytujesz z bufora klawiatury tylko 'm', ENTER pozostaje. Za drugim razem czytasz ten pozostawiony ENTER. I tak w kółko.
Jeżeli masz Javę >= 7, to zamień kod na taki:

import java.io.*;
 
public class MonetaOrKostka {
    public static void main(String args[]) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String c="e";
        System.out.print("m - Moneta \nk - Kostka \nz - Zakoncz\n");
        while(true) {
 
            try {
                c=reader.readLine();
            }
            catch(IOException e) { System.out.println("Blad odczytu"); 
            }
            System.out.println("Wybrales: " + c);
            switch(c) {
            case "z": return;
            case "m": System.out.println("Rzucam moneta"); break;
            case "k": System.out.println("Rzucam koscia"); break;
            default: System.out.println("Zly wybor, sprobuj ponownie");
            }
        }
    }
}
0

Rzeczywiście, nie wpadłem na to, dzięki.
Jeszcze od siebie wymyśliłem coś takiego, bo jednak wole na charach :)

 
	    do {
			try {
				    c=(char)reader.read();
			}
			catch(IOException e) { System.out.println("Blad odczytu"); 
			}
	    } while (c=='\n');
0

Kiepski pomysł, jeśli wolisz na charach, to

            try {
                    c=reader.readLine().charAt(0);
            }

readLine() czyta łącznie ze znakiem nowego wiersza.

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