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

时间:2017-05-16 14:18:13

标签: java formatting string-formatting

问题

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

输出代码

在每行输出中应该有两列: 第一列包含String,并使用正好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(),但现在程序只会打印前两行并跳过打印最后一行(代码I)写道应该接受3行文本并使用printf将这三行打印到标准输出。 有谁能解释为什么会这样?

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

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

有人可以解释为什么会这样吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

如果你将input放在你的代码之后,sc.next()会读取并使用下一个字符串,那么你的循环将从第二行的整数开始 - 这就是为什么它不能正常工作。现在如果你放Scanner,它会读取并消耗下一行,所以你的循环将从第三行开始,这就是你只有两行的原因。循环后不应使用sc.nextLine()sc.next();保持原样。