Lendo um inteiro da entrada padrão

86

Como uso a fmt.Scanffunção em Go para obter uma entrada inteira da entrada padrão?

Se isso não puder ser feito usando fmt.Scanf, qual é a melhor maneira de ler um único inteiro?

yasith
fonte

Respostas:

133

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

Todas as bibliotecas incluídas no Go estão bem documentadas.

Dito isso, eu acredito

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

faz o truque

cthom06
fonte
fmt.Scanf levou cerca de um minuto para verificar 1 milhão de inteiros.
robert king
@robertking tente usar um bufio. É um exemplo simples.
cthom06
5
Você pode explicar por que devemos entrar &ie não apenas icomo fmt.Printf("%v", i)?
Zeynel
6
@Zeynel Porque os parâmetros são passados ​​por valor no Go. ié apenas o valor inteiro em i, &ié um ponteiro para i.
cthom06
@ cthom06 o que você estava usando para digitalizar com o bufio? err ... Quero dizer, se você estivesse usando o Scanner, qual interface estava inserindo no Scanner para fazer a varredura stdin? NVM, parece que Golang tem um exemploscanner := bufio.NewScanner(os.Stdin)
Greg
48

Uma alternativa que pode ser um pouco mais concisa é usar apenas fmt.Scan:

package main

import "fmt"

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

Isso usa reflexão sobre o tipo de argumento para descobrir como a entrada deve ser analisada.

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

iainmcgin
fonte
4

Aqui está meu método "Fast IO" para ler números inteiros positivos. Ele poderia ser melhorado com bitshifts e layout de memória antecipadamente.

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
fonte
3

Golang fmt.Scan é mais simples que Golang fmt.Scanf (que é mais simples que Clang scanf)

Se erros fmt.Scan, ou seja, se não for nulo, registrar e retornar

1 Leia uma única variável:

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 Leia várias variáveis:

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)

Boa sorte

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

Manohar Reddy Poreddy
fonte
0

Você pode usar fmt.Scanfcom um especificador de formato. O especificador de formato para o inteiro é% d. Portanto, você pode usar a entrada padrão como abaixo.

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

ou então você pode usar fmt.Scanou fmt.Scanlncomo abaixo.

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