Lecture d'un entier à partir d'une entrée standard

85

Comment utiliser la fmt.Scanffonction dans Go pour obtenir une entrée entière à partir de l'entrée standard?

Si cela ne peut pas être fait avec fmt.Scanf, quelle est la meilleure façon de lire un seul entier?

yasith
la source

Réponses:

132

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

Toutes les bibliothèques incluses dans Go sont bien documentées.

Cela étant dit, je crois

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

fait l'affaire

cthom06
la source
fmt.Scanf a pris environ une minute pour scanner 1 million d'entiers.
robert king
@robertking essayez d'utiliser un bufio à la place. C'est un exemple simple.
cthom06
À votre santé. Bufio est rapide.
robert king
5
Pouvez-vous expliquer pourquoi nous devons entrer &iet pas simplement icomme dans fmt.Printf("%v", i)?
Zeynel
6
@Zeynel Parce que les paramètres sont passés par valeur dans Go. iest juste la valeur entière dans i, &iest un pointeur vers i.
cthom06
48

Une alternative qui peut être un peu plus concise consiste simplement à utiliser fmt.Scan:

package main

import "fmt"

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

Cela utilise une réflexion sur le type de l'argument pour découvrir comment l'entrée doit être analysée.

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

iainmcgin
la source
4

Voici ma méthode "Fast IO" pour lire des entiers positifs. Il pourrait être amélioré avec des bitshifts et en disposant la mémoire à l'avance.

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
la source
3

Golang fmt.Scan est plus simple que Golang fmt.Scanf (qui est plus simple que Clang scanf)

Si fmt.Scan erreurs, c'est-à-dire si non nul, consigner et retourner

1 Lire une seule variable:

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 Lisez plusieurs variables:

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)

Bonne chance

Exemple tiré de: http://www.sortedinf.com/?q=golang-in-1-hour

Manohar Reddy Poreddy
la source
0

Vous pouvez utiliser fmt.Scanfavec un spécificateur de format. Le spécificateur de format pour l'entier est% d. Vous pouvez donc utiliser une entrée standard comme ci-dessous.

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

ou bien vous pouvez utiliser fmt.Scanou fmt.Scanlncomme ci-dessous.

func main() {
   var someVar int
   fmt.Scanln(&someVar)
}
Jacinthe de Kaveen
la source