fmt.Scanf
Standart girişten bir tamsayı girişi almak için Go'daki işlevi nasıl kullanırım ?
Bu kullanılarak yapılamazsa fmt.Scanf
, tek bir tamsayıyı okumanın en iyi yolu nedir?
Yanıtlar:
http://golang.org/pkg/fmt/#Scanf
Go'da bulunan tüm kitaplıklar iyi bir şekilde belgelenmiştir.
Söyleniyor, inanıyorum
func main() {
var i int
_, err := fmt.Scanf("%d", &i)
}
hile yapar
&i
olduğu i
gibi girmemiz gerektiğini açıklayabilir misiniz fmt.Printf("%v", i)
?
i
sadece tamsayı değeridir i
, &i
bir işaretçidir i
.
scanner := bufio.NewScanner(os.Stdin)
Biraz daha özlü olabilecek bir alternatif, sadece kullanmaktır fmt.Scan
:
package main
import "fmt"
func main() {
var i int
fmt.Scan(&i)
fmt.Println("read number", i, "from stdin")
}
Bu, girdinin nasıl çözümlenmesi gerektiğini keşfetmek için bağımsız değişkenin türüne ilişkin yansımayı kullanır.
İşte pozitif tam sayıları okumak için benim "Hızlı GÇ" yöntemim. Bit kaydırmalarla ve önceden bellek yerleştirilerek geliştirilebilir.
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, Golang fmt.Scanf'den daha basittir (Clang scanf'den daha basittir)
Fmt.Scan hataları, yani sıfır değilse, günlüğe kaydet ve döndür
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)
İyi şanslar
fmt.Scanf
Bir format belirticisi ile kullanabilirsiniz . Tamsayı için biçim belirticisi% d'dir. Böylece aşağıdaki gibi standart girişi kullanabilirsiniz.
func main() {
var someVar int
fmt.Scanf("%d", &someVar)
}
veya aşağıdaki gibi fmt.Scan
veya kullanabilirsiniz fmt.Scanln
.
func main() {
var someVar int
fmt.Scanln(&someVar)
}