Jak używać fmt.Scanf
funkcji w Go, aby uzyskać dane wejściowe w postaci liczby całkowitej ze standardowego wejścia?
Jeśli nie można tego zrobić za pomocą fmt.Scanf
, jaki jest najlepszy sposób na odczytanie pojedynczej liczby całkowitej?
Odpowiedzi:
http://golang.org/pkg/fmt/#Scanf
Wszystkie dołączone biblioteki w Go są dobrze udokumentowane.
Biorąc to pod uwagę, wierzę
func main() {
var i int
_, err := fmt.Scanf("%d", &i)
}
Zrób sztuczkę
&i
a nie tak i
jak w fmt.Printf("%v", i)
środku?
i
jest po prostu liczbą całkowitą w i
, &i
jest wskaźnikiem do i
.
Alternatywą, która może być nieco bardziej zwięzła, jest użycie fmt.Scan
:
package main
import "fmt"
func main() {
var i int
fmt.Scan(&i)
fmt.Println("read number", i, "from stdin")
}
Wykorzystuje to refleksję nad typem argumentu, aby odkryć, jak dane wejściowe powinny być analizowane.
Oto moja metoda „Fast IO” do odczytywania dodatnich liczb całkowitych. Można to ulepszyć za pomocą przesunięć bitowych i wcześniejszego rozmieszczenia pamięci.
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
}
Golang fmt.Scan jest prostszy niż Golang fmt.Scanf (który jest prostszy niż Clang scanf)
Jeśli fmt.Scan zawiera błędy, tzn. Jeśli nie jest to zero, zaloguj i zwróć
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)
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)
Powodzenia
Przykład z: http://www.sortedinf.com/?q=golang-in-1-hour
Możesz użyć fmt.Scanf
ze specyfikatorem formatu. Specyfikatorem formatu liczby całkowitej jest% d. Możesz więc użyć standardowego wejścia, jak poniżej.
func main() {
var someVar int
fmt.Scanf("%d", &someVar)
}
albo możesz użyć fmt.Scan
lub fmt.Scanln
jak poniżej.
func main() {
var someVar int
fmt.Scanln(&someVar)
}