2013-04-16 13 views
8

Это, наверное, одна из самых простых вещей, но я не вижу, что я делаю неправильно.Почему nextLine() возвращает пустую строку?

Мой ввод состоит из одной первой строки с номером (количество строк для чтения), связкой строк с данными и последней строкой только с \ n. Я должен обработать этот ввод и после последней строки выполнить некоторую работу.

У меня есть этот вход:

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

И для чтения входа у меня есть этот код.

int numberRegisters; 
String line; 

Scanner readInput = new Scanner(System.in); 

numberRegisters = readInput.nextInt(); 

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

Мой вопрос: почему я ничего не печатаю? Программа считывает первую строку и затем ничего не делает.

+0

Кстати, не первый номер - это количество тестов? – RiaD

+0

Попробуйте заменить! Line.isEmpty() с помощью строки! = Null? – user2147970

+0

Да, это число тестов – Favolas

ответ

31

nextInt не читает следующий символ новой строки, поэтому первый nextLine (which returns the rest of the current line) всегда будет возвращать пустую строку.

Это должно работать:

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

Но мой совет не смешивать nextLine с nextInt/nextDouble/next/и т.д., потому что кто-то пытается сохранить код (включая вас) не может быть в курсе, или забыл, выше, поэтому может быть несколько смущен приведенным выше кодом.

Так что я предлагаю:

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

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

Черт! , Любое объяснение причин такого поведения? –

1

Я думаю, что я вижу эту проблему раньше. Я думаю, что нужно добавить еще readInput.nextLine() или еще вы только чтение между концом 5, и \n после этого

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

На самом деле это не дает ответа на вопрос, полностью (почему ваш код не является рабочий), но вы можете использовать следующий код.

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

Как для меня это более удобным для чтения и даже может сэкономить ваше время в таких редких случаях, когда testcases неверны (с дополнительной информацией в конце файла)

BTW, кажется, вы принимаете участие в каком-то программирование соревнование. Обратите внимание, что сканер может быть довольно медленным для ввода большого количества данных. вы можете использовать BufferedReader с возможным StringTokenizer (не требуется в этой задаче)

Смежные вопросы