0

我想编写具有此功能的程序:用户将输入他有多少东西。他将输入这些东西,然后将其添加到列表中。我做了这个代码:

public class lists {
public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    LinkedList<String> list= new LinkedList<String>();
    System.out.println("How many things you have?");
    int size=input.nextInt();
    LinkedList<String> list= new LinkedList<String>();
    System.out.println("Enter those things");
    for(int c=1;c<=size;c++) list.add(input.nextLine().toString());     
        System.out.printf("%s",list);

}   

}

例如,数字 5 的输出如下所示:

[, 1st Inputed, 2nd Inputed,3rd Inputed, 4nd inputed]

我想知道为什么列表中的第一个字符串是空的,它让我可以输入更少的东西。感谢您的帮助。

4

2 回答 2

1

你的代码应该是这样的:

 public class lists {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        System.out.println("How many things you have?");
        int size=input.nextInt();
        LinkedList<String> list= new LinkedList<String>();
        System.out.println("Enter those things");
        for(int c=0 ;c < size; c++)
        {
            String s = input.next();//use next() instead of nextLine()
            list.add(s);     
        }
            System.out.printf("%s",list);

       } 
    }

Scanner.nextLine()如官方文档所述是:

将此扫描器前进到当前行并返回被跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。位置设置为下一行的开头。

nextInt()被调用之后,它没有正确终止分配的内存行。因此,当nextLine()第一次调用时,它实际上终止了实际上具有值的前一行——通过输入nextInt()而不是接收新String值。这就是为什么Stringat 索引0list空白的原因。因此,为了继续读取输入的值而不是前一个空行(因为返回的值不终止nextInt()),您可以使用Scanner.next()which 根据官方文档指出:

从此扫描器中查找并返回下一个完整的令牌。

于 2013-03-23T18:19:43.463 回答
0

问题是input.nextInt()不消耗尾随换行符,所以第一个input.nextLine()返回一个空字符串。

有几种方法可以解决这个问题。我会把它作为一个练习来弄清楚如何最好地做到这一点。

于 2013-03-23T18:19:58.627 回答