2016-11-25 8 views
5

Когда я использую scan.nextLine(), поля ввода не работают должным образом. Если это scan.next(), работает отлично. Но почему? Разве я не должен использовать scan.nextLine() для строки?Сканер для строки не работает в Java

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

вы можете показать формат ввода? – Mritunjay

+0

Добавьте 'scan.useDelimiter (System.getProperty (« line.separator »)),' – iNan

+0

. Моя рекомендация состояла бы в том, чтобы просто сделать один вызов String p = scan.nextLine(); для каждой строки. Затем проанализируйте строку и разделите ее на нужные вам компоненты. – holycatcrusher

ответ

0

Вы должны использовать nextLine, а затем преобразовать его в ваших ожидаемых типов.

В приведенном выше сценарии прочитайте строку, затем переведите ее в целое число, потому что и 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]; 
+2

и зачем мне это делать? На этом ответе есть и нижняя сторона. – Mritunjay

+3

Кто бы ни был, пожалуйста, оставляйте комментарии. Спасибо – Mritunjay

+0

точно, кто бы ни был вниз, прошу оставить комментарии. – lmiguelvargasf

0

Это решение проблемы, которую я бы использовал. Выше комментарий Тахир Хуссейн Mirwould скорее всего, причиной проблемы

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

} 
1

Перед их использованием, попробуйте проверить Дока.
Причина:

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