为什么 sc.next() 或 sc.nextLine() 在循环内不起作用?
Why does sc.next() or sc.nextLine() not work inside a loop?
问题
每行输入都包含一个字符串,后跟一个整数。
每个字符串最多包含 10 个字母字符,每个整数都包含在 运行ge 范围内,从 0 到 999
输出代码
在每行输出中应该有两列:
第一列包含字符串,并使用恰好 15 个字符左对齐。
第二列包含整数,正好用 3 位数字表示;如果原始输入少于三位数,则必须用零填充输出的前导数字。
查看此 link 了解更多信息:
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("================================");
}
}
我的确切 doubt/question
虽然上面的代码编译并且 运行 完美,但我决定进行一些更改并尝试一些不同的东西。我在
行之后添加了以下代码行
int x=sc.nextInt();
我添加的行是:
sc.next();
但是,添加该行代码后,程序将不再接受第一行之后的输入。那只是输入的第一行会被打印而下一行被忽略(不打印)。
我将代码 sc.next() 更改为 sc.nextLine() 但现在程序只会打印前 2行并跳过打印最后一行(我编写的代码应该接受 3 行文本并使用 printf 将这三行打印到标准输出)。
谁能解释一下为什么会这样?
我在网上看到,如果我必须在分别使用 next() 和 nextInt() 读取整数后读取字符串,那么我需要在读取整数之后和之前添加额外的 next() 或 nextLine() 调用读取字符串。
(这是为了将扫描仪移动到下一个字符,因为 nextInt() 忽略了转义字符)。
在我的程序中,在循环的第一次迭代期间,最后一次从标准输入读取是在读取整数时发生的。在第二次迭代开始时,字符串是第一个被读取的。因此注意到这一点,我进行了更改,但程序没有按计划 运行。但是,如果我删除中间的额外读取,该程序将完美运行。
谁能解释一下为什么会这样?
提前致谢
如果您在代码后放置 sc.next()
,Scanner
将读取并使用下一个字符串,然后您的循环将从第二行的整数开始——这就是它无法正常工作的原因.现在如果你输入 sc.nextLine()
,它将读取并使用下一行,所以你的循环将从第三行开始,这就是你只有两行的原因。您不应该在循环后使用 sc.next()
或 sc.nextLine()
;保持原样。
问题
每行输入都包含一个字符串,后跟一个整数。 每个字符串最多包含 10 个字母字符,每个整数都包含在 运行ge 范围内,从 0 到 999
输出代码
在每行输出中应该有两列: 第一列包含字符串,并使用恰好 15 个字符左对齐。 第二列包含整数,正好用 3 位数字表示;如果原始输入少于三位数,则必须用零填充输出的前导数字。
查看此 link 了解更多信息: 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("================================");
}
}
我的确切 doubt/question
虽然上面的代码编译并且 运行 完美,但我决定进行一些更改并尝试一些不同的东西。我在
行之后添加了以下代码行int x=sc.nextInt();
我添加的行是:
sc.next();
但是,添加该行代码后,程序将不再接受第一行之后的输入。那只是输入的第一行会被打印而下一行被忽略(不打印)。 我将代码 sc.next() 更改为 sc.nextLine() 但现在程序只会打印前 2行并跳过打印最后一行(我编写的代码应该接受 3 行文本并使用 printf 将这三行打印到标准输出)。 谁能解释一下为什么会这样?
我在网上看到,如果我必须在分别使用 next() 和 nextInt() 读取整数后读取字符串,那么我需要在读取整数之后和之前添加额外的 next() 或 nextLine() 调用读取字符串。 (这是为了将扫描仪移动到下一个字符,因为 nextInt() 忽略了转义字符)。
在我的程序中,在循环的第一次迭代期间,最后一次从标准输入读取是在读取整数时发生的。在第二次迭代开始时,字符串是第一个被读取的。因此注意到这一点,我进行了更改,但程序没有按计划 运行。但是,如果我删除中间的额外读取,该程序将完美运行。
谁能解释一下为什么会这样?
提前致谢
如果您在代码后放置 sc.next()
,Scanner
将读取并使用下一个字符串,然后您的循环将从第二行的整数开始——这就是它无法正常工作的原因.现在如果你输入 sc.nextLine()
,它将读取并使用下一行,所以你的循环将从第三行开始,这就是你只有两行的原因。您不应该在循环后使用 sc.next()
或 sc.nextLine()
;保持原样。