2013-04-16 5 views
8

C'est probablement l'une des choses les plus simples mais je ne vois pas ce que je fais de mal.Pourquoi nextLine() renvoie une chaîne vide?

Mon entrée consiste en une première ligne avec un nombre (le nombre de lignes à lire), un groupe de lignes avec des données et une ligne finale avec seulement \ n. Je devrais traiter cette entrée et après la dernière ligne, faire un peu de travail.

J'ai cette entrée:

5 
test1 
test2 
test3 
test4 
test5 
     /*this is a \n*/ 

Et pour lire l'entrée, j'ai ce code.

int numberRegisters; 
String line; 

Scanner readInput = new Scanner(System.in); 

numberRegisters = readInput.nextInt(); 

while (!(line = readInput.nextLine()).isEmpty()) { 
    System.out.println(line + "<"); 
} 

Ma question est pourquoi je n'imprime rien? Le programme lit la première ligne, puis ne fait rien.

+0

btw, n'est pas le premier nombre est le nombre de tests? – RiaD

+0

Essayez de remplacer! Line.isEmpty() par ligne! = Null? – user2147970

+0

Oui, c'est le nombre de tests – Favolas

Répondre

31

nextInt ne lit pas le caractère de nouvelle ligne suivant, donc le premier nextLine (which returns the rest of the current line) retournera toujours une chaîne vide.

Cela devrait fonctionner:

numberRegisters = readInput.nextInt(); 
readInput.nextLine(); 
while (!(line = readInput.nextLine()).isEmpty()) { 
    System.out.println(line + "<"); 
} 

Mais mon conseil est de ne pas mélanger avec nextLinenextInt/nextDouble/next/etc parce que toute personne essayant de maintenir le code (vous inclus) peuvent ne pas être au courant, ou ont oublié, ci-dessus, donc peut être quelque peu confus par le code ci-dessus.

Je suggère donc:

numberRegisters = Integer.parseInt(readInput.nextLine()); 

while (!(line = readInput.nextLine()).isEmpty()) { 
    System.out.println(line + "<"); 
} 
+0

Merde! . Toute explication sur pourquoi ce comportement? –

1

Je pense que je l'ai vu ce problème avant. Je pense que vous avez besoin d'ajouter un autre readInput.nextLine() ou bien vous lisez juste entre la fin de la 5 et le \n après

int numberRegisters; 
String line; 

Scanner readInput = new Scanner(System.in); 

numberRegisters = readInput.nextInt(); 
readInput.nextLine(); 

while (!(line = readInput.nextLine()).isEmpty()) { 
    System.out.println(line + "<"); 
} 
0

En fait, il ne répond pas complètement à la question (pourquoi votre code n'est pas working) mais vous pouvez utiliser le code suivant.

int n = Integer.parseInt(readInput.readLine()); 
for(int i = 0; i < n; ++i) { 
    String line = readInput().readLine(); 
    // use line here 
} 

Quant à moi, il est plus facile à lire et même peut sauver votre temps dans ces rares cas où testcases sont incorrectes (avec informations supplémentaires à la fin du fichier)

BTW, vous semble prendre part à une programmation compétition. Notez que Scanner peut être assez lent à entrer beaucoup de données. vous pouvez envisager d'utiliser BufferedReader avec StringTokenizer possible (pas nécessaire dans cette tâche)

Questions connexes