2009-09-23 9 views
24

Ich habe den folgenden Code:Java Scanner Klasse Lesung Strings

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(); 
} 

und die Ausgabe für diesen Code ist folgende:

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

Beachten Sie, wie es den Vornamen Eintrag übersprungen ?? Es übersprang es und ging direkt zum zweiten Eintrag. Ich habe versucht zu schauen, was das verursacht, aber ich kann es nicht finden. Ich hoffe, dass mir jemand helfen kann. Danke

+2

Exact (wirklich, genau) Spiel von http://stackoverflow.com/questions/1466008/ Java-Scanner-Klasse-Lesestrings / – CPerkins

Antwort

26

Der Grund für den Fehler ist, dass die nextInt nur die ganze Zahl, nicht die Newline zieht. Wenn Sie vor Ihrer for-Schleife eine in.nextLine() hinzufügen, wird die leere neue Zeile aufgefressen und Sie können 3 Namen eingeben.

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(); 
} 

oder lesen Sie einfach die Zeile und parsen Sie den Wert als Ganzzahl.

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

Es ist, weil die in.nextInt() Zeile nicht ändert. Du machst also zuerst "Enter" (nachdem du 3 gedrückt hast) das endOfLine gelesen von deiner in.nextLine() in deiner Schleife.

Hier eine kleine Änderung, die Sie tun können:

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

Dies, weil in.nextInt() nur eine int Nummer erhalten, erhält keine neue Zeile. Sie geben also 3 ein und drücken "Enter", das Ende der Zeile wird von in.nextline() gelesen.

Hier ist mein Code:

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

Sie einfach

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

ersetzt haben könnte Mit next() wird nur zurückkehren, was vor einem Raum kommt. nextLine() verschiebt den Scanner automatisch nach dem Zurückgeben der aktuellen Zeile.

3

Verwendung sc.nextLine(); zwei Mal, so dass wir die letzte Zeile der Zeichenfolge lesen können

sc.nextLine() sc.nextLine()