今天遇到一個很奇怪的事情,日常刷題中,遇到一個很簡單的題: (不想看我多逼逼只想知道為什麼會出錯看最後) 題目: 題目描述 description 題目描述 description 現有有N個學生的數據記錄,每個記錄包括學號、姓名、三科成績。 編寫一個函數input,用來輸入一個學生的數據記錄。 編 ...
今天遇到一個很奇怪的事情,日常刷題中,遇到一個很簡單的題:
(不想看我多逼逼只想知道為什麼會出錯看最後)
題目:
題目描述 description
現有有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數組了,希望有大佬能給我解答,或者有更好的辦法歡迎討論。