Сканер для строки не работает в Java
Когда я использую scan.nextLine(), поля ввода не работают должным образом. Если это scan.next(), работает отлично. Но почему? Разве я не должен использовать scan.nextLine () для строки?
import java.util.Scanner;
public class Test{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int x = scan.nextInt();
System.out.println("p");
String p = scan.nextLine();
System.out.println("q");
String q = scan.next();
System.out.println("m");
String m = scan.next();
}
}
3 ответа
Перед их использованием попробуйте проверить документы.
Причина:
Scanner.nextLine: метод java.util.Scanner.nextLine() продвигает этот сканер за текущую строку и возвращает пропущенный ввод. Этот метод возвращает остаток текущей строки, исключая любой разделитель строк в конце. Позиция устанавливается в начале следующей строки. Так как этот метод продолжает поиск по вводу в поисках разделителя строк, он может буферизовать весь ввод, ищущий строку, чтобы пропустить, если нет разделителей строк.
Хотя это не относится к Scanner.nextInt
Следовательно, метод Scanner.nextInt не использует последний символ новой строки вашего ввода, и, таким образом, эта новая строка используется при следующем вызове Scanner.nextLine.
Основным решением будет использование пустого Scanner.nextLine после Scanner.nextInt только для использования оставшейся части этой строки, включая символ новой строки.
Например
int myVal1 = input.nextInt();
input.nextLine();
String myStr1 = input.nextLine();
Это решение проблемы, которую я бы использовал. Приведенный выше комментарий Тахира Хуссейна Мира, вероятно, станет причиной проблемы.
import java.util.ArrayList;
import java.util.Scanner;
public class app {
public static void main(String[] args) {
// declare scanner
Scanner scan = new Scanner(System.in);
// what ever number you need, it could be calculated
int numberOfInputLines = 3;
// the list of the lines entered
ArrayList<String[]> list = new<String[]> ArrayList();
// add each line to the list
for (int i = 0; i < numberOfInputLines; i++) {
// get entire line as a single string
String input = scan.nextLine();
// split the line into tokens, and store the array in the array list
String[] result = input.split("\\s");
list.add(result);
}
// iterate through each line
for (int i = 0; i < list.size(); i++) {
// iterate through the line
for (int j = 0; j < list.get(i).length; j++) {
if (isInteger(list.get(i)[j]) == true) {
// do what you want if the input is an int
//to show it works
System.out.println("int: " + list.get(i)[j]);
} else {
// do what you want if a the token inputed is a string
//to show it works
System.out.println("String: " + list.get(i)[j]);
}
}
}
}
// greasy way to check if is an int
private static boolean isInteger(String s) {
try {
Integer.parseInt(s);
} catch (NumberFormatException e) {
return false;
} catch (NullPointerException e) {
return false;
}
// only got here if we didn't return false
return true;
}
}
Вы должны использовать nextLine
а затем преобразовать его в ваши ожидаемые типы.
В приведенном выше сценарии прочитайте строку, затем приведите ее к целому числу, потому что next
а также nextInt
просто прочитайте ввод до того, как появятся пробелы. Поэтому, когда вы звоните nextInt
он будет просто потреблять номер и оставит newLine
персонаж, который будет потребляться в nextLine
,
Из вопроса, похоже, что именно так вы собираетесь читать вводные данные.
- Первое целое число
- Вторая строковая строка.
- Третья строка будет иметь два слова, разделенных пробелом.
Это то, что ваш код должен быть.
Scanner scan = new Scanner(System.in);
int x = Integer.parseInt(scan.nextLine()); //read line and then cast to integer
System.out.println("p");
String p = scan.nextLine();
System.out.println("q m");
String[] linesParts = scan.nextLine().split(" "); // read the whole line and then split it.
String q = linesParts[0];
String m = linesParts[1];