• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Klasa skaner - czyszczenie bufora

Object Storage Arubacloud
0 głosów
1,663 wizyt
pytanie zadane 2 stycznia 2017 w Java przez rubesom Obywatel (1,690 p.)

Cześć,

Mam kod który działa dobrze:

	public static void main(String[] args) 
	{

		Scanner wejscie = new Scanner(System.in);
		System.out.println("Podaj imię");
		String imie = wejscie.nextLine();
		System.out.println("Witaj " + imie);
		
		System.out.println("Podaj wiek");
		int wiek = wejscie.nextInt();
		System.out.println("Twój wiek to " + wiek);
        }

i podobny który ignoruje drugie pobranie z klawiatury ("String jednostkaPromienia = in.nextLine();"):

	public static void main(String[] args) 
	{
		Scanner in = new Scanner(System.in);
	    System.out.println("Podaj długość promienia koła");
	    double promieńKoła= in.nextDouble();
//	    in.nextLine();
	    System.out.println("Podaj jednoskę długości promienia koła");
	    String jednostkaPromienia = in.nextLine();
	    
	    System.out.println(promieńKoła);
	    System.out.println(jednostkaPromienia);
	}

Doczytałem, że chodzi tu o czyszczenie bufora ale dla czego w pierwszym przypadku działa to bez tego czyszczenia a w drugim muszę podać to co jest zakomentowane?

I jak działa dokładnie to czyszczenie? Nie rozumiem jak wywołanie metody nextLine na obiekcie ma czyścić ten bufor?

 

Proszę o pomoc

2 odpowiedzi

+1 głos
odpowiedź 2 stycznia 2017 przez Mateusz51 Nałogowiec (28,180 p.)
wybrane 3 stycznia 2017 przez rubesom
 
Najlepsza
Chodzi o to że gdy używasz nextInt(), nextDouble() i inne takie. Scanner pobiera Ci tylko tę wartość, zostawiajac w bufforze np znak nowej lini. Gdy użyjesz nextLine() bez wcześniejszego wyczyszczenia buffora to metoda zgodnie z tym co działa zwróci Ci wszystkie znaki do znaku nowej lini.

Jeśli input wyglada tak

17
CM

To nextInt() poda Ci 17, pierwszy nextLine() poda ci string pusty (ponieważ do konca lini już nic nie ma), a drugi nextLine() zwróci ci CM
komentarz 2 stycznia 2017 przez rubesom Obywatel (1,690 p.)
A jak to działa w pierwszym przykładzie, że nie muszę "czyścić" bufora?

Czyli jak podaje w tym drugim przykładzie w "String jednostkaPromienia = in.nextLine();"

to on już tam ma znak nowej linii "ENTER" z wcześniejszego wczytania?
komentarz 2 stycznia 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Działa ponieważ po zapytaniu nextInt() nie robisz nextLine(). Po porstu nie obchodzi Cie czy coś w tym buforze ugrzęzło czy nie.

Tak, w buforze cały czas czeka enter z poprzedniego wczytania.
komentarz 2 stycznia 2017 przez rubesom Obywatel (1,690 p.)
Czyli enter jest pobierany zawsze (nextInt(), nextDouble()...) ale wczytywany tylko przy nextLine()?
komentarz 2 stycznia 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Co masz na myśli pobierany?

Jest załadowany do buffora. Tak naprawde nextLine() nie pobiera entera tylko wszystkie znaki od miejsca w którym skonczyliśmy do nastepnego entera.

Może bardziej byś sobie to uświadomił jakbyś zamiast z konsoli pobierał dane to pobierał je z jakiegoś pliku. Bo w konsoli jest ten problem że enter jest również sygnałem wpisania danych
komentarz 3 stycznia 2017 przez rubesom Obywatel (1,690 p.)
Z tego co napisałeś zrozumiałem, że nextInt(); pobiera do bufora liczbę np. 25 i ENTER który naciskam po wpisaniu tej liczby?

A wymieniony ENTER jest "użyty" dopiero w momencie użycia nextLine().

Dobrze rozumiem?
komentarz 3 stycznia 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Tak o to chodzi.
komentarz 3 stycznia 2017 przez rubesom Obywatel (1,690 p.)

Bardzo Ci dziękuję za pomoc, to mi wiele tłumaczy.

Jeżeli znajdziesz chwilę to powiedz mi proszę jak to działa w przypadku takim gdzie pobieram z klawiatury nextInt() kilka razy i np. za czwartym razem wczytuję (bez czyszczenia bufora) nextLine(). To nie jest tak, że powinienem mieć tyle enterów ile mam metodę nextInt()?

Tutaj przykład:

        System.out.println("1");
		int a = wejscie.nextInt();
		System.out.println("2" + a);
		int b = wejscie.nextInt();
		System.out.println("3" + b);
		int c = wejscie.nextInt();
		System.out.println("4" + c);
		String x = wejscie.nextLine();
		System.out.println(x);
		System.out.println("abc");

Tutaj tak jak mi opisałeś mam zapchany bufor i na końcu wczytuje mi mi z niego ENTER. A nie powinno być tak, że będzie przechowywać trzy entery?

komentarz 3 stycznia 2017 przez Mateusz51 Nałogowiec (28,180 p.)
edycja 3 stycznia 2017 przez Mateusz51
No nie. Ponieważ nextInt ignoruje wszystkie białe znaki. Czyli pomija entery.
Po drugie nextLine() nie pobiera entera. Pobiera wszystkie znaki do entera. Ale entera nie pobiera. Tylko kasuje go z buffora. Drukujesz enter ponieważ robisz println() który automatycznie dodaje enter.
komentarz 3 stycznia 2017 przez rubesom Obywatel (1,690 p.)

Skoro nextInt() nie pobiera entera tylko znaki liczbowe to skąd w buforze zostają jakieś znaki, że trzeba go czyścić?

		System.out.print("1");
		int a = wejscie.nextInt();
		System.out.print(a);
		String b = wejscie.nextLine();
		System.out.print(b);

Np. w takim kodzie podaję np. cyfrę 25 i bez czyszczenia bufora zostanie zignorowana linia gdzie chciał bym pobrać Stringa, bo jak mówisz jest coś w buforze.

komentarz 3 stycznia 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Bo nextInt pomija tylko białe znaki do wystąpienia liczby. Nie po. Wszystko po liczbie siedzi sobie grzecznie w bufforze.
komentarz 3 stycznia 2017 przez rubesom Obywatel (1,690 p.)
A jak to działa, że nextLine() czyści bufor?
komentarz 3 stycznia 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Wczytuje wszystkie znaki do entera
0 głosów
odpowiedź 3 stycznia 2017 przez operator Stary wyjadacz (10,920 p.)

Prościej będzie z BufferedReader. Pamiętaj o przechwyceniu IOException.
 

BufferedReader bufread = new BufferedReader(new InputStreamReader(System.in));
String str = bufread.readLine();
int wiek = Integer.parseInt( str );
System.out.println( wiek );

 

Podobne pytania

0 głosów
1 odpowiedź 846 wizyt
pytanie zadane 3 września 2016 w Java przez Jonki Dyskutant (8,180 p.)
0 głosów
1 odpowiedź 184 wizyt
pytanie zadane 23 października 2020 w C i C++ przez adamos321 Nowicjusz (140 p.)
0 głosów
1 odpowiedź 452 wizyt
pytanie zadane 26 kwietnia 2020 w C i C++ przez ResCrove Obywatel (1,700 p.)

92,617 zapytań

141,466 odpowiedzi

319,783 komentarzy

61,999 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...