2010-09-20 21 views

Respuesta

97

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

Todas las bibliotecas incluidas en Go están bien documentados.

Dicho esto, creo

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

hace el truco

+0

fmt.Scanf tomó cerca de un minuto para escanear 1 millón de números enteros. –

+0

@robertking intente usar un bufio en su lugar Es un ejemplo simple. – cthom06

+0

Saludos. Bufio es rápido. –

37

Una alternativa que puede ser un poco más concisa es utilizar simplemente fmt.Scan:

package main 

import "fmt" 

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

Este utiliza la reflexión sobre el tipo de argumento para descubrir cómo debe analizarse la entrada.

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

+14

No debe hacer eso sin verificar si hay errores;) – kyrias

3

Aquí es mi método "Fast IO" para la lectura de los números enteros positivos. Se podría mejorar con cambios de bits y disposición de memoria con antelación.

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 
} 
1

Golang fmt.Scan es más simple que Golang fmt.Scanf (que es más sencillo que Clang scanf)

Si los errores fmt.Scan, es decir, por no decir nulas, inicie sesión & retorno

1 Leer sola variables:

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 Leer múltiples 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) 

mejor de la suerte

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

Cuestiones relacionadas