Сканер для строки не работает в 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,

Из вопроса, похоже, что именно так вы собираетесь читать вводные данные.

  1. Первое целое число
  2. Вторая строковая строка.
  3. Третья строка будет иметь два слова, разделенных пробелом.

Это то, что ваш код должен быть.

    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];
Другие вопросы по тегам