Lesen einer Ganzzahl von der Standardeingabe

85

Wie verwende ich die fmt.ScanfFunktion in Go, um eine ganzzahlige Eingabe von der Standardeingabe zu erhalten?

Wenn dies nicht möglich ist fmt.Scanf, wie kann man dann eine einzelne Ganzzahl am besten lesen?

Yasith
quelle

Antworten:

130

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

Alle in Go enthaltenen Bibliotheken sind gut dokumentiert.

Davon abgesehen glaube ich

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

macht den Trick

cthom06
quelle
fmt.Scanf brauchte ungefähr eine Minute, um 1 Million Ganzzahlen zu scannen.
Robert King
@robertking versuchen Sie stattdessen ein Bufio zu verwenden. Es ist ein einfaches Beispiel.
cthom06
Prost. Bufio ist schnell.
Robert King
5
Können Sie erklären, warum wir eintreten müssen &iund nicht nur iwie in fmt.Printf("%v", i)?
Zeynel
6
@Zeynel Da Parameter in Go als Wert übergeben werden. iist nur der ganzzahlige Wert in i, &iist ein Zeiger auf i.
cthom06
48

Eine Alternative, die etwas prägnanter sein kann, ist die Verwendung von fmt.Scan:

package main

import "fmt"

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

Hierbei wird anhand der Art des Arguments ermittelt, wie die Eingabe analysiert werden soll.

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

iainmcgin
quelle
3

Hier ist meine "Fast IO" -Methode zum Lesen positiver Ganzzahlen. Es könnte durch Bit-Shifts und das vorherige Auslegen des Speichers verbessert werden.

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
}
Robert King
quelle
3

Golang fmt.Scan ist einfacher als Golang fmt.Scanf (was einfacher ist als Clang scanf)

Wenn fmt.Scan-Fehler, dh wenn nicht null, protokollieren und zurückgeben

1 Einzelne Variable lesen:

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 Lesen Sie mehrere Variablen:

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)

Viel Glück

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

Manohar Reddy Poreddy
quelle
0

Sie können fmt.Scanfmit einem Formatbezeichner verwenden. Der Formatbezeichner für die Ganzzahl ist% d. Sie können also die Standardeingabe wie unten verwenden.

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

oder Sie können fmt.Scanoder fmt.Scanlnwie unten verwenden.

func main() {
   var someVar int
   fmt.Scanln(&someVar)
}
Kaveen Hyacinth
quelle