• 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,649 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 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ź 840 wizyt
pytanie zadane 3 września 2016 w Java przez Jonki Dyskutant (8,180 p.)
0 głosów
1 odpowiedź 179 wizyt
pytanie zadane 23 października 2020 w C i C++ przez adamos321 Nowicjusz (140 p.)
0 głosów
1 odpowiedź 446 wizyt
pytanie zadane 26 kwietnia 2020 w C i C++ przez ResCrove Obywatel (1,700 p.)

92,555 zapytań

141,403 odpowiedzi

319,558 komentarzy

61,940 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!

...