2010-09-20 8 views
60

Wie verwende ich die fmt.Scanf-Funktion in Go, um eine Ganzzahleingabe von der Standardeingabe zu erhalten?Lesen einer Ganzzahl aus der Standardeingabe

Wenn dies nicht mit fmt.Scanf durchgeführt werden kann, was ist der beste Weg, um eine einzelne ganze Zahl zu lesen?

Antwort

97

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

Alle eingebundenen Bibliotheken in Go sind gut dokumentiert.

aber sagen, dass ich glaube,

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

funktioniert der Trick

+0

fmt.Scanf dauerte etwa eine Minute 1 Million ganze Zahlen zu scannen. –

+0

@robertking versuchen, stattdessen eine Bufio verwenden Es ist ein einfaches Beispiel. – cthom06

+0

Prost. Bufio ist schnell. –

37

Eine Alternative, die ein bisschen mehr prägnant sein kann, ist einfach zu bedienen fmt.Scan:

package main 

import "fmt" 

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

Diese nutzt Reflexion über der Typ des Arguments, um zu ermitteln, wie die Eingabe analysiert werden soll.

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

+14

Das solltest du nicht tun, ohne nach Fehlern zu suchen;) – kyrias

3

Hier ist meine "Fast IO" Methode für positive ganze Zahlen zu lesen. Es könnte mit Bitshift verbessert werden und Speicher im Voraus auslegen.

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 ist einfacher als Golang fmt.Scanf (die einfacher als Clang scanf ist)

Wenn fmt.Scan Fehler, dh wenn nicht gleich Null, log & Rückkehr

1 Lesen Single 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 lesen mehreren Variablen:

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) 

Best of luck

Beispiel aus: http://www.sortedinf.com/?q=golang-in-1-hour

Verwandte Themen