Scanner

Chengkai730發表於2024-08-30

Java 用 Scanner 類接受鍵盤輸入。

步驟:

  1. 匯入該類所在的包(要使用一個類的話就必須先匯入該類所在的包)

  2. 建立該類的物件

  3. 呼叫裡面的功能

Scanner 有兩套系統。

第一套系統:

nextInt();
nextDouble();
next();
// 等等...

第二套系統:

nextLine();  // 接收一個字串

程式示例:

import java.util.Scanner;  // 導包

public class Input {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // 只有 sc 是變數名,只有 sc 可以改變,其他的都不允許改變。
        System.out.print("請輸入一個使用者的名字: ");
        String name = sc.next(); // 接收一個字串
        System.out.print("請輸入使用者的年齡: ");
        int age = sc.nextInt(); // 接收一個整數
        System.out.print("請輸入使用者的薪水: ");
        double salary = sc.nextDouble(); // 接收一個double資料
        System.out.println("使用者資訊如下:");
        System.out.println("姓名: " + name);
        System.out.println("年齡: " + age);
        System.out.println("薪水: " + salary);
    }
}

執行結果:

請輸入一個使用者的名字: 小章
請輸入使用者的年齡: 20
請輸入使用者的薪水: 20000
使用者資訊如下:
姓名: 小章
年齡: 20
薪水: 20000.0

第一套系統,遇到空白停止接收,剩餘輸入存在於緩衝中,等待下一次讀入。

程式示例:

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("enter some words: ");
        String s = sc.next();
        System.out.println(s);
    }
}

執行結果:

enter some words: xiao cheng
xiao

程式示例:

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入第一個整數:");
        int num1 = sc.nextInt();
        System.out.println(num1);
        System.out.println("請輸入第二個整數:");
        int num2 = sc.nextInt();
        System.out.println(num2);
    }
}

執行結果:

請輸入第一個整數:
123 456
123
請輸入第二個整數:
456

練習:

import java.util.Scanner;

public class Input {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a, b;
        System.out.print("輸入一個整數:");
        a = sc.nextInt();
        System.out.print("輸入另一個整數:");
        b = sc.nextInt();
        System.out.println("兩個整數的和為 " + (a + b));
    }
}

執行結果:

輸入一個整數:198 
輸入另一個整數:876
兩個整數的和為 1074

第二套系統,可以接收一整行輸入,直到遇到回車才停止接收資料。

程式示例:

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入第一個字串:");
        String line1 = sc.nextLine();
        System.out.println(line1);
        System.out.println("請輸入第二個字串:");
        String line2 = sc.nextLine();
        System.out.println(line2);
    }
}

執行結果:

請輸入第一個字串:
hello     world
hello     world
請輸入第二個字串:
早    上     好
早    上     好

兩套系統混著用的一個弊端:

import java.util.Scanner;

public class test2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入一個數字:");
        int num1 = sc.nextInt();
        System.out.println(num1);
        System.out.println("請輸入一個字串:");
        String line1 = sc.nextLine();
        System.out.println(line1);
        System.out.println("結束");
    }
}

執行結果 1:

請輸入一個數字:
123
123
請輸入一個字串:

結束

line1 讀取到了一個字串,但是不會將字串儲存進去,所以 line1 是空的,因此此處的 System.out.println(line1); 相當於 System.out.println("");,也相當於 System.out.println();。因此僅僅只列印了一個換行。

執行結果 2:

請輸入一個數字:
123     456
123
請輸入一個字串:
     456
結束

程式示例:

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入第一個字串:");
        String line1 = sc.nextLine();
        System.out.print(line1);  // 是 print 而不是 println
        System.out.println("請輸入第二個字串:");
        String line2 = sc.nextLine();
        System.out.println(line2);
    }
}

執行結果:

請輸入第一個字串:
hello   world
hello   world請輸入第二個字串:
   你    好
   你    好

由此可見,nextLine() 不會把換行符儲存在字串中。nextLine() 可以將換行符從緩衝區中讀取走且不放到字串中,這樣換行符既不在緩衝區,也不在換行符中,相當於丟棄了。但是 Scanner 的第一套用法是把所有輸入中除了讀取到的東西之外的東西全部放到緩衝區中等待下次讀取。在第一套系統中,比如輸入 123 456,但是會帶著一個回車,然後只讀取了 123,就剩下 三個空格加數字 456 再加一個回車在記憶體中。如果輸入的是 123,那麼讀取走 123 放到對應的變數中,剩餘一個換行符留在緩衝區中。第二套系統不會把換行符讀進變數,不會把換行符儲存在變數中,也不會把換行符留在緩衝區等待下一次讀取。

相關文章