Scanner 的應用

How does Scanner work?

Scanner 的讀法可以分成兩種:token-reading方法, 以及非token-reading方法
token-reading 方法:包含 netxtByte(), nextInt(), nextDouble, next()等方法。是將讀進來的東西視作 token,token 與 token 之間是由 delimiters 分開。預設的 delimiter 是空白字元(whitespace character)。
token-reading 方法運作過程:第一步會先跳過任何的 delimiter,再來開始讀 token,直到碰到另一個 delimiter為止(讀進來的token不包含ending delimiter)。
nextLine() 的運作過程:從delimiter開始讀文字直到碰到換行字元(\r\n on Windows and \n on UNIX,會把換行字元讀進去,但不會包含在讀到的文字裡頭)
我們來看看以下範例:



import java.util.Scanner;

public class Read {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner input = new Scanner(System.in);
        String name, gender, age;
        System.out.print("請問您的姓名為:");
        name = input.next();
        System.out.print("請問您的性別為:");
        gender = input.next();
        System.out.print("請問您的年齡為:");
        age = input.next();

        System.out.println("最後讀到的結果:");
        System.out.print(name);
        System.out.print(gender);
        System.out.print(age);

    }

}

console 跑出來的畫面會是:
請問您的姓名為:abby[enter]
請問您的性別為:F[enter]
請問您的年齡為:23[enter]
最後讀到的結果:
abbyF23
使用者在鍵盤上輸入了abby後按下了enter,next()為token-reading method, 跳過任何delimiter後開始讀文字直到遇到delimiter所以
name = abby
gender and age 同name一樣,使用者在鍵盤上輸入資料後按下了enter,next()為token-reading method, 跳過任何delimiter後開始讀文字直到遇到delimiter所以
gender = F
age = 23
但若是下列範例呢?



import java.util.Scanner;

public class Read {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner input = new Scanner(System.in);
        String name, gender, age;
        System.out.print("請問您的姓名為:");
        name = input.next();
        System.out.print("請問您的性別為:");
        gender = input.nextLine(); // 這裡改為nextLine() 而非 next()

        System.out.print("請問您的年齡為:");
        age = input.next();

        System.out.println("最後讀到的結果:");
        System.out.print(name);
        System.out.print(gender);
        System.out.print(age);

    }

}

console 跑出來的畫面會是:
請問您的姓名為:abby[enter]
請問您的性別為:請問您的年齡為:23[enter]
最後讀到的結果:
abby23
使用者在鍵盤上輸入了abby後按下了enter,next()為token-reading method, 跳過任何delimiter後開始讀文字直到遇到delimiter(不會把delimiter讀進去),所以
name = abby
因為前一個用的讀法是token-reading method,讀到delimiter便會停止且不讀入,因此下一個開始讀的會從它沒讀進去的delimiter開始讀,而我們在輸入姓名的時候是輸入abby [enter],那個enter的動作會被讀成換行字元
然而,我們下一個讀的動作是用nextLine(),此方法會從前一個delimiter開始一直讀到換行字元(會讀到換行字元,但不會包含在讀進來的字串內),因此gender吃到是空白的字串!也就是
gender = ""
然後程式繼續執行印出請問您的年齡,然後使用者再輸入年齡.....所以最後的結果就會變成abby23
同學可以利用範例2的程式碼輸入
請問您的姓名為:abby(空白字元)[enter]
請問您的性別為:請問您的年齡為:23[enter]
看看最後讀到的結果會不會是
abby(空白字元)23
ps 這邊的(空白字元)是指鍵盤打出來的空格“ ”<---不是要同學真的打出「(空白字元)」喔XD

留言