Lettura di un numero intero dallo standard input


86

Come si usa la fmt.Scanffunzione in Go per ottenere un input intero dallo standard input?

Se non è possibile farlo utilizzando fmt.Scanf, qual è il modo migliore per leggere un singolo numero intero?

Risposte:


133

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

Tutte le librerie incluse in Go sono ben documentate.

Detto questo, credo

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

fa il trucco


fmt.Scanf ha impiegato circa un minuto per scansionare 1 milione di numeri interi.
robert king

@robertking prova a usare un bufio invece È un semplice esempio.
cthom06

5
Puoi spiegare perché dobbiamo entrare &ie non solo icome dentro fmt.Printf("%v", i)?
Zeynel

6
@Zeynel Perché i parametri vengono passati per valore in Go. iè solo il valore intero in i, &iè un puntatore a i.
cthom06

@ cthom06 cosa stavi usando per la scansione con bufio? err ... Voglio dire se stavi usando Scanner quale interfaccia stavi inserendo nello Scanner per scansionare stdin? NVM, sembra che Golang abbia un esempioscanner := bufio.NewScanner(os.Stdin)
Greg

48

Un'alternativa che può essere un po 'più concisa è usare semplicemente fmt.Scan:

package main

import "fmt"

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

Questo utilizza la riflessione sul tipo di argomento per scoprire come deve essere analizzato l'input.

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


4

Ecco il mio metodo "Fast IO" per leggere interi positivi. Potrebbe essere migliorato con bitshift e disponendo la memoria in anticipo.

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 è più semplice di Golang fmt.Scanf (che è più semplice di Clang scanf)

Se fmt.Scan ha degli errori, cioè se non è nullo, registra e ritorna

1 Leggi singola variabile:

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 Leggi più variabili:

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)

Buona fortuna

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


0

È possibile utilizzare fmt.Scanfcon un identificatore di formato. L'identificatore di formato per il numero intero è% d. Quindi puoi usare l'input standard come di seguito.

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

oppure puoi usare fmt.Scano fmt.Scanlncome sotto.

func main() {
   var someVar int
   fmt.Scanln(&someVar)
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.