Почему этот цикл for не позволяет мне вводить текст в первом цикле? - PullRequest
0 голосов
/ 29 ноября 2009

Что я хочу сделать, это попросить пользователя ввести количество строк в массив, а затем попросить пользователя ввести это количество строк и прочитать их в массив. Когда я запускаю этот код, он никогда не запрашивает у меня ввод первого цикла первого цикла for, просто выводит «String # 0: String # 1:», а затем я могу ввести текст. Почему это и что я сделал не так?

import java.util.Scanner;

public class ovn9 
{
public static void main(String[] args)
{
    Scanner sc=new Scanner(System.in);

    System.out.print("Number of inputs: ");

    int lines= sc.nextInt();
    String[] text=new String[lines];

    for(int x=0; x<text.length; x++)
    {
        System.out.print("String #"+x+": ");
        text[x] = sc.nextLine();
    }

    for(int y=0; y<text.length; y++)
        System.out.println(text[y]);

}
}

Ответы [ 2 ]

4 голосов
/ 29 ноября 2009

Буферизация.

nextInt() не использует символ новой строки во входном буфере, который был помещен туда, когда вы ввели количество входов. В итерации 0 цикла for уже есть строка ввода в буфере, и nextLine() может завершиться немедленно, и программа будет ожидать новую строку ввода только в итерации 1. Чтобы игнорировать новую строку во вводе, вы можете добавить просто еще один nextLine() вызов перед входом в цикл for.

0 голосов
/ 29 ноября 2009

Возможно, вам следует изменить цикл, чтобы использовать 'sc.next ()'

for ( int x = 0; x < lines; x++ ) {
    System.out.print("String #" + x + ": ");
    text[x] = sc.next();
}

Это можно объяснить с помощью API Java

String next (): Находит и возвращает следующий полный токен с этого сканера.

String nextLine (): продвигает этот сканер за текущую строку и возвращает пропущенный ввод.

...