• java:nextInt()和nextLine()一起使用出错


    今天遇到一个很奇怪的事情,日常刷题中,遇到一个很简单的题:

    (不想看我多逼逼只想知道为什么会出错看最后)

    题目:

    现有有N个学生的数据记录,每个记录包括学号、姓名、三科成绩。 编写一个函数input,用来输入一个学生的数据记录。 编写一个函数print,打印一个学生的数据记录。 在主函数调用这两个函数,读取N条记录输入,再按要求输出。 N<100

    遇到这个题,对于用c语言的同学,构建结构体,加以顺序表,输入格式也有scanf函数控制轻松解决。

    但是用java来做,就需要考虑,先将这一行数据转化为独立的数据,由于java里面没有类似scanf(“%d:::::%d”,&n,&m)这样格式输入的函数。

    先将一行数据转化为可以识别的单个数据:

     1 import java.util.Scanner;
     2 
     3 public class Test {
     4     public static void main(String[] args) {
     5         Scanner sc = new Scanner(System.in);
     6         String s = sc.nextLine();
     7         String ss[] = s.split(" ");
     8         for (String x : ss) {
     9             System.out.println(x);
    10         }
    11     }
    12 }

    然后我发现这样连着使用in.nextInt()和in.nextLine()(和in.next()使用未发现问题

    会出现以下情况:

    这时我才发现第13行代码没有发生作用(如果是这样输入:1  a100 zhblue 70 80 90 在一行输入情况又会正常

     

    然后我百度发现:

    跳到这个位置:

         问题分析:nextLine()会把nextInt(),next(),nextDouble(),nextFloat()的结束换行符作为字符串读入,进而不需要从键盘输入字符串nextLine便已经转向了下一条语句执行。

          解决办法 : 在每一个nextInt(),next(),nextDouble(),nextFloat()后都加一个nextLine()语句,将被next()去掉的Enter过滤掉。

    比如图下(在第10行添加了一句in.innextLine();

    这道题的源码:

     1 import java.util.ArrayList;
     2 import java.util.Scanner;
     3 
     4 public class Main {
     5     public static void main(String[] args) {
     6         Scanner in = new Scanner(System.in);
     7         int n=in.nextInt();
     8         in.nextLine();
     9         ArrayList<a> p=new ArrayList<a>();
    10         for (int i=0;i<n;i++){
    11             String pdd=in.nextLine();
    12             String ss[]=pdd.split(" ");
    13             a temp=new a(ss[0],ss[1],ss[2],ss[3],ss[4]);
    14             p.add(temp);
    15         }
    16         for(a d:p){
    17             System.out.println(d.n+","+d.name+","+d.a1+","+d.a2+","+d.a3);
    18         }
    19     }
    20     static class a{
    21         public a(String n, String name, String a1, String a2, String a3) {
    22             this.n = n;
    23             this.name = name;
    24             this.a1 = a1;
    25             this.a2 = a2;
    26             this.a3 = a3;
    27         }
    28         String n;
    29         String name;
    30         String a1;
    31         String a2;
    32         String a3;
    33     }
    34 
    35 }

    但是还有一事:为什么java中不弄一个格式化输入,就像c中scanf(“%d:::::%d”,&n,&m)这样,就不需要将一行数据转成String数组了,希望有大佬能给我解答,或者有更好的办法欢迎讨论。

  • 相关阅读:
    [学习笔记] SSD代码笔记 + EifficientNet backbone 练习
    [论文理解] CornerNet: Detecting Objects as Paired Keypoints
    [torch] torch.contiguous
    [tensorflow] tf2.0 简单例子
    [大坑]Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
    本机Jenkins的使用
    安全工具acunetix使用
    cv2.matchTemplate()函数的应用,匹配图片后画出矩形
    python将PNG格式的图片转化成为jpg
    Python实现FTP文件的上传和下载
  • 原文地址:https://www.cnblogs.com/lzy321/p/10367884.html
Copyright © 2020-2023  润新知