为啥 sc.next() 或 sc.nextLine() 在循环中不起作用?

Posted

技术标签:

【中文标题】为啥 sc.next() 或 sc.nextLine() 在循环中不起作用?【英文标题】:Why does sc.next() or sc.nextLine() not work inside a loop?为什么 sc.next() 或 sc.nextLine() 在循环中不起作用? 【发布时间】:2017-05-16 14:18:12 【问题描述】:

问题

输入的每一行都包含一个字符串,后跟一个整数。 每个字符串最多有 10 个字母字符,每个整数都在 0 到 999 的范围内

输出代码

在每行输出中应该有两列: 第一列包含字符串,并使用正好 15 个字符左对齐。 第二列包含整数,以 3 位数字表示;如果原始输入的数字少于三位,则必须用零填充输出的前导数字。

查看此链接了解更多信息: hackerrank/challenges/java-output-formatting

这是我写的代码(Java):

 import java.util.Scanner;

 public class Solution 

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

    System.out.println("================================");
    for(int i=0 ; i<3 ; i++)
        String s1=sc.next();
        int x=sc.nextInt();
        System.out.printf("%-15s%03d\n",s1,x);
    
    System.out.println("================================");
  

我的确切疑问/问题

虽然上述代码编译并运行良好,但我决定进行一些更改并尝试一些不同的东西。我在该行之后添加了以下代码行

int x=sc.nextInt();

我添加的行是:

sc.next();

但是,在添加那行代码之后,程序将不再接受第一行之后的输入。那只是输入的第一行将被打印,而下一行将被忽略(不打印)。 我将代码 sc.next() 更改为 sc.nextLine() 但现在程序只会打印前 2 行并跳过打印最后一行(代码 I写应该接受 3 行文本并使用 printf 将这三行打印到标准输出)。 谁能解释一下为什么会这样?

我在网上读到,如果我必须在分别使用 next() 和 nextInt() 读取整数后读取一个字符串,那么我需要在读取整数之后和读取整数之前添加一个额外的 next() 或 nextLine() 调用细绳。 (这是为了将扫描仪移动到下一个字符,因为 nextInt() 忽略了转义字符)。

在我的程序中,在循环的第一次迭代期间,最后一次读取标准输入发生在读取整数时。在第二次迭代的开始,字符串是第一个被读取的。因此注意到这一点,我进行了更改,但程序没有按计划运行。但是,如果我删除中间的额外读取,该程序将完美运行。

谁能解释一下为什么会这样?

提前致谢

【问题讨论】:

Scanner is skipping nextLine() after using next(), nextInt() or other nextFoo() methods的可能重复 【参考方案1】:

如果您将sc.next() 放在代码后面,Scanner 将读取并使用下一个字符串,然后您的循环将从第二行的整数开始——这就是它无法正常工作的原因。现在,如果您输入sc.nextLine(),它将读取并使用下一行,因此您的循环将从第三行开始,这就是您只有两行的原因。您不应该在循环后使用sc.next()sc.nextLine();保持原样。

【讨论】:

nextInt() 不消耗 EOL(行尾)字符,因此您确实需要 nextLine() 来清除输入缓冲区。

以上是关于为啥 sc.next() 或 sc.nextLine() 在循环中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

acm处理输入输出Java

java console控制台next()与nextLine()区别

方法即用法

1033(13)

java中怎么声明键盘扫描器?

java Scanner