95 votes

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

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

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

146voto

cthom06 Points 3998

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'astuce

58voto

iainmcgin Points 777

Une alternative qui peut être un peu plus concise est d'utiliser simplement fmt.Scan :

package main

import "fmt"

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

Ceci utilise la 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

5voto

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

Si les erreurs fmt.Scan, c'est-à-dire si elles ne sont pas nulles, enregistrez et renvoyez

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 Lire 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 de : http://www.sortedinf.com/?q=golang-in-1 hour

5voto

robert king Points 5369

Voici ma méthode "Fast IO" pour lire des entiers positifs. Il pourrait être amélioré avec des décalages binaires et la mise en page de 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
}

0voto

Kaveen Hyacinth Points 165

Vous pouvez utiliser fmt.Scanf avec un spécificateur de format. Le format spécifié 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)
}

Sinon, vous pouvez utiliser fmt.Scan ou fmt.Scanln comme ci-dessous.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X