標準入力から整数を読み取る


85

fmt.ScanfGoの関数を使用して、標準入力から整数入力を取得するにはどうすればよいですか?

を使用してこれを実行できない場合fmt.Scanf、単一の整数を読み取るための最良の方法は何ですか?

回答:


132

http://golang.org/pkg/fmt/#Scanf

Goに含まれているすべてのライブラリは十分に文書化されています。

そうは言っても、私は信じています

func main() {
    var i int
    _, err := fmt.Scanf("%d", &i)
}

トリックを行います


fmt.Scanfは、100万個の整数をスキャンするのに約1分かかりました。
ロバートキング

@robertking代わりにbufioを使用してみてくださいこれは簡単な例です。
cthom06 2013年

乾杯。ブフィオは速いです。
ロバートキング2013

5
私たちは入力する必要がありますなぜあなたは説明でき&iないだけとiのようにfmt.Printf("%v", i)
Zeynel 2013

6
@ZeynelパラメータはGoの値で渡されるためです。iはの整数値でありi&iはへのポインタiです。
cthom06 2013

48

もう少し簡潔にすることができる代替手段は、単に使用することfmt.Scanです:

package main

import "fmt"

func main() {
    var i int
    fmt.Scan(&i)
    fmt.Println("read number", i, "from stdin")
}

これは、引数のタイプに関するリフレクションを使用して、入力を解析する方法を検出します。

http://golang.org/pkg/fmt/#Scan


4

これが正の整数を読み取るための私の「高速IO」メソッドです。事前にビットシフトとメモリのレイアウトを行うことで改善できます。

package main

import (
    "io/ioutil"
    "bufio"
    "os"
    "strconv"
)


func main() {
    out := bufio.NewWriter(os.Stdout)
    ints := getInts()
    var T int64
    T, ints = ints[0], ints[1:]
    ..
    out.WriteString(strconv.Itoa(my_num) + "\n")
    out.Flush()
    }
}

func getInts() []int64 {
    //assumes POSITIVE INTEGERS. Check v for '-' if you have negative.
    var buf []byte
    buf, _ = ioutil.ReadAll(os.Stdin)
    var ints []int64
    num := int64(0)
    found := false
    for _, v := range buf {
        if '0' <= v && v <= '9' {
            num = 10*num + int64(v - '0') //could use bitshifting here.
            found = true
        } else if found {
            ints = append(ints, num)
            found = false
            num = 0
        }
    }
    if found {
        ints = append(ints, num)
        found = false
        num = 0
    }
    return ints
}

3

Golangfmt.ScanはGolangfmt.Scanf(Clang scanfよりも単純です)よりも単純です

fmt.Scanエラーの場合、つまりnilでない場合は、ログに記録して返します

1単一の変数を読み取ります:

import (
    "fmt"
    "log"
)

var i int
if    _, err := fmt.Scan(&i);    err != nil {
    log.Print("  Scan for i failed, due to ", err)
    return
}

fmt.Println(i)

2複数の変数を読み取ります。

import (
    "fmt"
    "log"
)

var i, j, k int  
if    _, err := fmt.Scan(&i, &j, &k);    err != nil {
    log.Print("  Scan for i, j & k failed, due to ", err)
    return
}

fmt.Println(i, j, k)

幸運を祈ります

例:http//www.sortedinf.com/?q = golang-in-1-hour


0

fmt.Scanfフォーマット指定子とともに使用できます。整数のフォーマット指定子は%dです。したがって、以下のような標準入力を使用できます。

func main() {
    var someVar int
    fmt.Scanf("%d", &someVar)
}

さもなければ、あなたは使用することができfmt.Scanたりfmt.Scanln、次のように。

func main() {
   var someVar int
   fmt.Scanln(&someVar)
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.