0

我的代码产生了意想不到的结果。似乎我的 for 循环跳过了第一次迭代,我不明白为什么。

public static void main(String[] args) {

    Scanner get = new Scanner(System.in);
    int number;

    // Ex.1.

    String family_name;
    String[] family_array;

    System.out.println("Enter number of family members: ");
    number = get.nextInt();
    family_array = new String[number];

    for(int i = 0; i < number; i++){
        System.out.println("Enter family member name: ");
        family_name = get.nextLine();
        family_array[i] = family_name;
    }

    for(int i = 0; i < number; i++){
        System.out.println(family_array[i]);
    }

}

返回...(假设输入的数字是名称)

Enter number of family members: 
5
Enter family member name: 
Enter family member name: 
1
Enter family member name: 
2
Enter family member name: 
3
Enter family member name: 
4

1
2
3
4

为什么第一个 get.nextLine() 被跳过?

4

5 回答 5

5

目前,您对Scanner#nextInt的调用不使用换行符,因此它被传递给您的第一次调用Scanner#nextLine,因此它不会阻塞

您将需要添加

get.nextLine();

在调用之后,nextInt以便您的第一次调用nextLine将阻止IO.

于 2013-02-05T18:29:04.983 回答
3

注意到 4 和 1 之间的空白行了吗?

4
       //this is it
1

当您调用 get.NextInt() 时,您不会吃掉整行,而只会吃下一个 int。该行的剩余部分在您的第一次循环迭代中被吃掉。读取 int 后添加对 get.nextLine() 的调用。

于 2013-02-05T18:29:42.497 回答
0

对我有用的是Scanner在每次迭代中实例化一个新的:

for(int i = 0; i < number; i++)
{
    System.out.println("Enter family member name: ");

    Scanner loopGet = new Scanner(System.in);
    family_name = loopGet.nextLine();
    family_array[i] = family_name;
}
于 2013-02-05T18:33:26.803 回答
0
    number = get.nextInt();
     // if i enter 4 then it will 4\n and nextInt will take only 4 
     // and the \n will be taken as input by the getline.
    get.nextLine();  
     //this will return the "" from ""\n . so adding this will solve your problem
    family_array = new String[number];
于 2013-02-05T18:34:18.193 回答
0

我要说这是因为你仍然有一个缓冲的 CR/LF - 所以第一个设置为空白。请注意打印您的姓氏(数字)时的空白行。那是你的空白姓氏。

键盘输入是一个缓冲流——它有你的 5,它有一个 CR/LF(或者可能只是一个 LF,取决于你的操作系统)。

您可能想要获取 LINE,然后执行 string.convert、atoi、system.convert(无论哪个用于 Java)来获取 #。

于 2013-02-05T18:35:26.150 回答