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數組了,希望有大佬能給我解答,或者有更好的辦法歡迎討論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM