Java Scanner.readLine 消耗换行符,但使用 println 时不消耗换行符

seok1213

代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class MainT {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str="";
        List<String> strs = new ArrayList<>();
        for(int i= 0; i<3;i++) {
            str = scanner.nextLine();
            strs.add(str);
        }
        System.out.println(strs);
    }
}

安慰

1        // input
2        // input
[1, , 2]

我想输入三遍。但只有两次有效。我认为scanner.nextLine 会消耗换行符。但是当我使用时System.out.println,它会工作三次。

代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class MainT {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str="";
        List<String> strs = new ArrayList<>();
        for(int i= 0; i<3;i++) {
            str = scanner.nextLine();
            strs.add(str);
            System.out.println("String: " + str);
        }
        System.out.println(strs);
    }
}

安慰

1         // input
String: 1         
2         // input
String: 2         
3         // input
String: 3         
[1, 2, 3] 

我的环境是 mac monterey 12.3.1 intel 芯片。我使用采用 temurin java 11。为什么它通过使用 println 工作不同?

正如该nextLine()方法的文档所述

将此扫描器前进到当前行并返回被跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符[...]

https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextLine()

按回车键对应输入两个字符:换行符(\n)和回车符(\r)。这两个都是行分隔符。当您键入第一个输入然后按 Enter 时,Scanner返回第一行,停止然后等待第二个输入(您的第二次nextLine()调用)。但是,由于已经有一个行终止符(前一次读取的第二个行终止符),一旦您输入第二个输入,您的扫描仪会立即在开头停止并返回一个空的String. 在那之后,同样的事情不断发生,似乎只读取了两个读数中的一个。

您需要做的是nextLine() 在每次读取之间(而不是在每次读取之后)放置一个额外的内容,以摆脱那个“额外的”行终止符。

Scanner scanner = new Scanner(System.in);
String str = "";
List<String> strs = new ArrayList<>();
System.out.println("Enter three numbers: ");
for (int i = 0; i < 3; i++) {
    str = scanner.nextLine();
    // The last iteration does not need to get rid of that "extra" line terminator
    // because there is no following read; 
    // otherwise you would be forced to input an extra number
    if (i < 2) {
        scanner.nextLine();
    }
    strs.add(str);
}
System.out.println(strs);

或者,您可以在每次阅读之前通过打印消息请求输入。这样,Scanner由于屏幕上写入的文本, 的内部光标将向前移动“额外”行分隔符,并允许您使用单个nextLine().

Scanner scanner = new Scanner(System.in);
String str = "";
List<String> strs = new ArrayList<>();
for (int i = 0; i < 3; i++) {
    System.out.print("Enter a number: ");
    str = scanner.nextLine();
    strs.add(str);
}
System.out.println(strs);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章