用Scanner读入多行数据最后一行读不进去是为什么?

package excise2;
import java.util.*;
public class TestExe1 {

 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();
   }


 Arrays.sort(str);

 for(int i=0;i<num;i++)
     {
     System.out.println(str[i]);
 }

}
}


3个回答

将 for循环里的 sc.nextline()方法改为 sc.next();

在代码里加入测试语句可以看到 使用sc.nextline()时进入for循环后

图片说明

当改成sc.next();后进入循环后会等待第一次输入

图片说明

你第一次读取其实是
int num=sc.nextInt();
String []str=new String[num];
这时候str[0]是你的第一行数据
然后你你for循环的第一次又是
str[i]=sc.nextLine();
这时候你给str[0]又赋值了,但是这时候sc.nextLine()是空的 因为你已经读过一次了
这次他找的是下一行,并没有下一行,所以你把str[0]赋值为空

所以最后输出 数组[0]其实是空的

,当next()、nextInt()、nextDouble()等等这些之后,你如果不再加一条in.nextLine()的话,下面如果用到了类似str = in.nextLine(); 这条语句的话,会首先读取上面next()、nextInt()、nextDouble()等等这些语句的回车作为一条默认的数据
解决方法:
输入
next()、nextInt()、nextDouble()等等这些 之后,再用一个in.nextLine()这个来截取上面的一个回车操作,后面的nextLine()在第一次才能起作用;

  public static void main(String args[])
     {
     Scanner sc=new Scanner(System.in);
     int num=sc.nextInt();
     sc.nextLine();
     String []str=new String[num];


       for(int i=0;i<num;i++)
       {
           Scanner sb=new Scanner(System.in);
               str[i]=sb.nextLine();
       }


     Arrays.sort(str);

     for(int i=0;i<num;i++)
         {
         System.out.println(str[i]);
     }
    }

qq_15098375
qq_15098375 不要瞎说了好不好
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐