2009-09-23 9 views
24

mam następujący kod:Java skanera klasy czytania ciągi

int nnames; 
String names[]; 

System.out.print("How many names are you going to save: "); 
Scanner in = new Scanner(System.in); 
nnames = in.nextInt(); 
names = new String[nnames]; 

for (int i = 0; i < names.length; i++){ 
    System.out.print("Type a name: "); 
    names[i] = in.nextLine(); 
} 

a wyjście dla tego kodu jest następujący:

How many names are you going to save:3 
Type a name: Type a name: John Doe 
Type a name: John Lennon 

Wskazówki, jak to pomijane pierwszy wpis nazwy ?? Pominął go i poszedł prosto do drugiego wpisu. Próbowałem sprawdzić, jakie są tego przyczyny, ale wydaje mi się, że nie jestem w stanie tego naprawić. Mam nadzieję, że ktoś mi pomoże. Dzięki

+2

Exact (naprawdę, dokładny) mecz http://stackoverflow.com/questions/1466008/ ciągi czytające klasy java/skaner / – CPerkins

Odpowiedz

26

Powodem błędu jest to, że nextInt tylko ściąga liczbę całkowitą, a nie znak nowej linii. Jeśli dodasz in.nextLine() przed pętlą for, zjadą pustą nową linię i wpiszesz 3 nazwy.

int nnames; 
String names[]; 

System.out.print("How many names are you going to save: "); 
Scanner in = new Scanner(System.in); 
nnames = in.nextInt(); 

names = new String[nnames]; 
in.nextLine(); 
for (int i = 0; i < names.length; i++){ 
     System.out.print("Type a name: "); 
     names[i] = in.nextLine(); 
} 

lub po prostu odczytać wiersz i przeanalizować wartość jako liczbę całkowitą.

int nnames; 
String names[]; 

System.out.print("How many names are you going to save: "); 
Scanner in = new Scanner(System.in); 
nnames = Integer.parseInt(in.nextLine().trim()); 

names = new String[nnames]; 
for (int i = 0; i < names.length; i++){ 
     System.out.print("Type a name: "); 
     names[i] = in.nextLine(); 
} 
2

To dlatego, że in.nextInt() nie zmienia linii. Najpierw więc "wejdź" (po naciśnięciu 3) spowodujesz, że endOfLine odczyta twoją in.nextLine() w twojej pętli.

Tutaj mała zmiana, że ​​można zrobić:

int nnames; 
    String names[]; 

    System.out.print("How many names are you going to save: "); 
    Scanner in = new Scanner(System.in); 
    nnames = Integer.parseInt(in.nextLine()); 
    names = new String[nnames]; 

    for (int i = 0; i < names.length; i++){ 
      System.out.print("Type a name: "); 
      names[i] = in.nextLine(); 
    } 
2

To dlatego in.nextInt() tylko otrzymać liczbę int, nie otrzyma nową linię. Więc wpisujesz 3 i wciskasz "Enter", koniec linii czyta się przez in.nextline().

Oto mój kod:

int nnames; 
String names[]; 

System.out.print("How many names are you going to save: "); 
Scanner in = new Scanner(System.in); 
nnames = in.nextInt(); 
in.nextLine(); 
names = new String[nnames]; 

for (int i = 0; i < names.length; i++){ 
     System.out.print("Type a name: "); 
     names[i] = in.nextLine(); 
} 
0

Mogłeś po prostu zastąpione

names[i] = in.nextLine(); z names[i] = in.next();

Korzystanie next() zwróci tylko to, co jest przed spacją. nextLine() automatycznie przesuwa skaner po powrocie do aktualnej linii.

3

użyj sc.nextLine(); dwa razem tak, że możemy czytać ostatnią linię łańcucha

sc.nextLine() sc.nextLine()