AtCoderやpaiza、コーディングテストで「標準入力から値を受け取る」処理を書く必要があります。
最近、AtCoderを始めたので、fmtパッケージで標準入力を受け取る方法をまとめてみます。
(bufioパッケージを使う方法は、そのうち...)
fmt.Scan
func Scan(a ...interface{}) (n int, err error)
( https://golang.org/pkg/fmt/#Scan )
スペース区切りの値を1つずつ順に読み込み、読み込み成功した数とエラーを返す。
※ 改行もスペースとして扱われる
例えば、「1 2」という標準入力だった場合、「1」を読み込み、次に「2」を読み込む。そのため、値を格納する変数は2つ必要。
package main import ( "fmt" ) func main() { var a, b int n, _ := fmt.Scan(&a, &b) fmt.Printf("Scan個数: %d\n", n) fmt.Println(a, b) }
実行すると↓↓↓な感じ。
次のように、1行目に入力されるデータ数があり、その後複数行の入力があるとき
5 // ← データ数 1 // 以下、入力データ 2 3 4 5
次のように、入力データをスライスに格納。
package main import ( "fmt" ) func main() { var n int fmt.Scan(&n) inputs := make([]int, n) for i := 0; i < n; i++ { fmt.Scan(&inputs[i]) } fmt.Println(inputs) }
fmt.Scanln
func Scanln(a ...interface{}) (n int, err error)
( https://golang.org/pkg/fmt/#Scanln )
Scanln は Scan と同じだが、改行でスキャン終了する。また、最後の項目の後にも改行またはEOFが必要。