Java Scanner处理输入遇到的一个问题

Java Scanner处理输入遇到的一个问题

笔试处理输入的时候又是遇到了一个“诡异”的问题,使用nextLine()读取多行字符串的时候,会丢失一行,

处理输入代码如下:

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        String[] str = new String[num];
        for (int i = 0; i < num; i++) {
            str[i] = sc.nextLine();
        }
        for(String s : str){
            System.out.println(s);
        }
    }
}

运行结果:

image-20200912210934463

可以看到,我明明在输入中想要传入四个字符串,但是终端只输出了三行,怎么丢一行?

问题出在这行语句:int num = sc.nextInt();

其实不只是这条语句,next(),nextFloat(),nextDouble()这些方法和nextLine()连在一起使用也是会出现这样的问题

产生原因:

Scanner在内存中的缓冲区中读取数据,上面的输入中,实际上我们的第一行输入是4\r,nextInt()方法在缓冲区中读到数字4之后,就直接返回了,没有继续处理缓冲区中的\r,而接下来调用nextLine()方法时,这个方法会读取每个\r之前的内容,然后把再把\r这个符号从缓冲区中删除掉,那么这里就出现问题了,nextLine()第一次读取的是空串"",循环一共是四次,所以也就只能读到前三行

那么怎么可以处理这种场景呢?

  • 使用nextLine()代替nextInt()

    这种方法需要做格式转换,例如:int num = Integer.parseInt(sc.nextLine());

  • 加上一个“多余”的nextLine(),消化掉\r

    如第一个椭圆区域所示:

    image-20200912212615395

这是结尾

上面大概介绍了遇到的情况以及解决的方案,使用猿辅导的笔试来踩这个坑代价实在有点大😂

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://hadoo666.top/archives/javascanner处理输入遇到的一个问题md