java中nextLine无法读入字符串的问题

一直习惯了使用next()方法读取字符串,今天遇到需要每次读取一行数据的需求,于是便想到了使用nextLine()方法。但使用的时候发现问题出现了,使用nextLine读取的字符串为空。一起通过下面这个例子来看下。

输入描述 

 第一行输入一个整数N,表示字符串的数量。接下来的N行每行输入一个字符串。如

3
abc
def
hij

 

输出描述

每读到一个字符串将其打印输出 

是不是觉得很简单?那我们来实现以下 

package leetcode.stack;

import java.util.Scanner;

/**
 * @基本功能:
 * @program:summary
 * @author:peicc
 * @create:2019-10-07 11:11:22
 **/
public class TestNextLine {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int N=sc.nextInt();//读取整数N
        for (int i = 0; i <N ; i++) {
            String str=sc.nextLine();//每次读取一行字符串
            System.out.println(str);
        }
    }
}

貌似跟想象中的有点不一样!!!第一个字符串的内容应该为abc,可输出的却为空。第二个字符串本应该为def,结果却输出了abc。第三个字符串本应该为hij,结果是def。而hij直接没输出就结束了。 这是怎么回事?我们仔细观察就会发现,虽然输出结果跟预期不一样,但有一点还是没问题的,那就是最终还是输出了三个字符串,只不过每个字符串的内容跟我们想的不一样。但规律也很好发现,就是一个字符串为空,接下来的字符串都是正常输出的前一个字符串。那么我们就会问了,为什么第一个字符串为空?这就需要从nextInt()方法与nextLine()方法 的区别去分析了。

next()与nextLine()的区别 

  • next()方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其过滤掉;只有在读取到有效字符之后,next()方法才将其后的空格键、Tab键或Enter键等视为结束符;所以next()方法不能得到带空格的字符串。
  • nextLine()方法字面上有扫描一整行的意思,它的结束符只能是Enter键,即nextLine()方法返回的是Enter键之前没有被读取的所有字符,它是可以得到带空格的字符串的。
  • next()方法在扫描到空白符的时候会将前面的数据读取走,但会丢下空白符“\r”在缓冲区中
  • nextLine()方法在扫描的时候会将扫描到的空白符一同清理掉

了解了上述区别后,我们就很好理解上面程序的运行结果了。首先通过nextInt()方法读取字符串的行数,但此时读取了N之后,N之后的换行符还在缓冲区中,此时当我们在for循环中第一次调用nextLine()方法时,读取的是N之后的换行符以及换行符之前没被读取的值,也就是空。故第一个字符串的内容为空。紧接着,第二次调用nextLine()方法时,读取的便是abc及其之后的换行符,第三次调用nextLine()方法时,读取的是def及其之后的换行符。循环了三次,结束循环,因此最后的hij便没有读取得机会。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章