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?

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


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


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
}

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


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)
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.