1

很抱歉,如果发布了类似的问题,我只是找不到。这是我的代码:

import java.util.*;

public class InputArraysNextLine
{
    static Scanner q = new Scanner(System.in);

    public static void main(String[] args)
    {
        System.out.print("n = ");
        int n = q.nextInt();

        int[] a = new int[n];
        String[] b = new String[n];

        for (int i = 0; i < n; i++)
        {
            System.out.print("Enter student name: ");
            b[i] = q.nextLine();

            q.next();
            System.out.print("Enter student number: ");

            a[i] = q.nextInt();
        }


        for (int i : a)
            System.out.print(i + " ");
        System.out.println();
        for (String j : b)
            System.out.print(j + " ");
    }
}

我打算在控制台上显示数组 a 和 b,但只显示 a。我相信 nextLine() 方法与此有关;即使当控制台显示“输入学生姓名:”时我实际上可以输入一些内容,程序也不会将输入存储到 b 字符串中。

4

3 回答 3

1

Scanner.nextInt()不消耗换行符,因此您需要nextLine()在获取 int 后调用以跳过它。您也不需要在调用next()后调用nextLine()

for (int i = 0; i < n; i++)
{
    System.out.print("Enter student name: ");
    b[i] = q.nextLine().trim(); // b is the whole line, trim() removes leading and trailing whitespace

    System.out.print("Enter student number: ");
    a[i] = q.nextInt();
    q.nextLine(); // nextInt() does not 
}

您还应该知道,仅运行一个期望能够抓取许多东西的循环也有点狡猾-您确实应该在尝试抓取它们之前检查它们以避免崩溃(例如,如果输入流提前终止)。可以使用has函数进行检查 -hasNext()用于标记、hasNextLine()用于行、hasNextInt()用于整数等。

于 2012-11-13T21:45:49.133 回答
0

您应该尝试替换:

b[i] = q.nextLine();
q.next();

和:

b[i] = q.next();

由于q.nextLine()返回流中跳过的输入,这里不是这种情况。

于 2012-11-13T21:21:11.443 回答
0

q.nextLine javadoc 声明“使此扫描仪前进到当前行并返回被跳过的输入。” 获取用户输入的输入的功能。

因此,您需要反转 b[i] 中捕获的内容

b[i] = q.nextLine(); q.next()

b[i] = q.next(); q.nextLine();

于 2012-11-13T21:29:50.210 回答