sirve scanner que para nextline libreria espacios error entrada con java string java.util.scanner

que - El ingreso de Java String Scanner no espera la información, se mueve directamente a la siguiente declaración. ¿Cómo esperar la información?



scanner java string (3)

Por eso yo no hacer no me gustó usar un Scanner , debido a este comportamiento. (Una vez que entendí lo que estaba sucediendo y me sentía cómodo con eso, me gusta mucho el escáner).

Lo que está sucediendo es que la llamada a nextLine() primero termina la línea donde el usuario ingresa el número de estudiantes. ¿Por qué? Porque nextInt() lee solo un int y no termina la línea.

Entonces, agregar una readLine() adicional resolvería este problema.

System.out.print("Enter the number of students: "); int numOfStudents = input.nextInt(); // Skip the newline input.nextLine(); System.out.print("Enter a student''s name: "); String student1 = input.nextLine();

Como ya mencioné, no me gustó usar el escáner. Lo que solía hacer era usar un BufferedReader. Es más trabajo, pero es un poco más sencillo lo que realmente está sucediendo. Su aplicación se vería así:

BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter the number of students: "); int numOfStudents = Integer.parseInt(input.readLine()); String topStudent = null; int topScore = 0; for (int i = 0; i < numOfStudents; ++i) { System.out.print("Enter the name of student " + (i + 1) + ": "); String student = input.nextLine(); // Check if this student did better than the previous top student if (score > topScore) { topScore = score; topStudent = student; } }

Esta pregunta ya tiene una respuesta aquí:

Estoy escribiendo un programa simple que le pide al usuario que ingrese un número de estudiantes, luego le pide que ingrese el nombre y la puntuación de cada estudiante para determinar qué estudiante tiene la puntuación más alta.

He escrito el código del programa y lo compila. La primera línea pide un número de estudiantes y espera por la entrada. Se supone que la segunda línea debe pedir el nombre de un estudiante y esperar la entrada, luego una tercera línea debe imprimir y pedir la calificación de ese estudiante, y esperar la entrada, pero después de que se imprima la segunda línea, la tercera línea se llama inmediatamente (la segunda línea sí no esperar por la entrada) y luego recibo un error de tiempo de ejecución al intentar ingresar la información solicitada después de la tercera línea.

¿Cómo ajusto el código para que la segunda línea imprima y espere a que se ingrese una cadena antes de imprimir la tercera línea?

import java.util.Scanner; public class HighestScore { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("Enter the number of students: "); int numOfStudents = input.nextInt(); System.out.print("Enter a student''s name: "); String student1 = input.nextLine(); System.out.print("Enter that student''s score: "); int score1 = input.nextInt(); for (int i = 0; i <= numOfStudents - 1; i++) { System.out.println("Enter a student''s name: "); String student = input.nextLine(); System.out.println("Enter that student''s score: "); int score = input.nextInt(); if (score > score1) { student1 = student; score1 = score; } } System.out.println("Top student " + student1 + "''s score is " + score1); } }


Wow, que parece un mal diseño: si solicita un número entero y hace un nextInteger (), el escáner le dará el número entero, pero ahora tiene un nuevo carácter de línea en su búfer, ya que el usuario tiene que presionar Intro para enviar el entero, por lo que si más adelante desea solicitarle al usuario una cadena, no esperará la entrada y le devolverá un nuevo carácter de línea. No puedes borrar el escáner para evitar este tipo de problema ...

¿Qué me estoy perdiendo?

Adán


System.out.print("Enter the number of students: "); int numOfStudents = input.nextInt(); // Eat the new line input.nextLine(); System.out.print("Enter a student''s name: "); String student1 = input.nextLine();