21
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

goでfmt.Scanする際の注意点

Last updated at Posted at 2018-03-28

はじめに

Goを勉強しようと思い、せっかくなので競技プログラミング系の問題を解きながら基本文法の整理をしようとしていました。
そうなると、標準入力が発生するので、以下の投稿を参考にして実装

Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版

なるべく短くしたいので、fmt.Scanを使って

package main

import (
	"fmt"
)

func main() {
	var a string
	fmt.Scan(&a)
	fmt.Println(a)
}

を使うことに。

問題

よっしゃこれでいいでしょ!と思い、hello worldを入力してそのまま帰ってくるか検証してみることに


$ go run practice.go
hello world
hello

あれ・・・?なぜかhelloだけ。

色々試行錯誤した結果ドキュメントを読むとこんな風に書いてました。

##Scan関数
func Scan(a ...interface{}) (n int, err os.Error)
Scanは、標準入力から読み込んだテキストをスキャンし、スペースで区切られた値として、順に引数に格納します。改行文字はスペースとしてカウントされます。この関数はスキャンに成功した項目数を返します。この数が、引数の数より少ないときは、errにその理由を返します。

つまり、自動で空白区切りで返してくれるんですね!
というわけで以下のように書いたら解決

package main

import (
	"fmt"
)

func main() {
	var a, b string
	fmt.Scan(&a, &b)
	fmt.Println(a, b)
}

結論

ちゃんとドキュメント読みましょう!笑

21
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?