ฉันจะใช้fmt.Scanf
ฟังก์ชันใน Go เพื่อรับอินพุตจำนวนเต็มจากอินพุตมาตรฐานได้อย่างไร
หากใช้ไม่ได้วิธีfmt.Scanf
ใดที่ดีที่สุดในการอ่านจำนวนเต็มเดียว
ฉันจะใช้fmt.Scanf
ฟังก์ชันใน Go เพื่อรับอินพุตจำนวนเต็มจากอินพุตมาตรฐานได้อย่างไร
หากใช้ไม่ได้วิธีfmt.Scanf
ใดที่ดีที่สุดในการอ่านจำนวนเต็มเดียว
คำตอบ:
http://golang.org/pkg/fmt/#Scanf
ไลบรารีทั้งหมดที่รวมอยู่ใน Go ได้รับการบันทึกไว้เป็นอย่างดี
ที่ถูกพูดฉันเชื่อ
func main() {
var i int
_, err := fmt.Scanf("%d", &i)
}
เคล็ดลับไม่
&i
และไม่เพียง แต่i
ในขณะที่fmt.Printf("%v", i)
?
i
เป็นเพียงค่าจำนวนเต็มในi
, เป็นตัวชี้ไป&i
i
scanner := bufio.NewScanner(os.Stdin)
อีกทางเลือกหนึ่งที่รัดกุมกว่านี้คือใช้fmt.Scan
:
package main
import "fmt"
func main() {
var i int
fmt.Scan(&i)
fmt.Println("read number", i, "from stdin")
}
สิ่งนี้ใช้การสะท้อนประเภทของอาร์กิวเมนต์เพื่อค้นหาว่าควรแยกวิเคราะห์ข้อมูลเข้าอย่างไร
นี่คือวิธี "Fast IO" สำหรับการอ่านจำนวนเต็มบวก สามารถปรับปรุงได้ด้วยบิตชิฟต์และจัดวางหน่วยความจำล่วงหน้า
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 (ซึ่งง่ายกว่า Clang scanf)
หากข้อผิดพลาด fmt.Scan เช่นถ้าไม่ใช่ศูนย์ให้เข้าสู่ระบบและส่งคืน
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)
ขอให้โชคดี
ตัวอย่างจาก: http://www.sortedinf.com/?q=golang-in-1-hour
คุณสามารถใช้fmt.Scanf
กับตัวระบุรูปแบบ ตัวระบุรูปแบบสำหรับจำนวนเต็มคือ% d ดังนั้นคุณสามารถใช้อินพุตมาตรฐานดังต่อไปนี้
func main() {
var someVar int
fmt.Scanf("%d", &someVar)
}
หรืออื่น ๆ ที่คุณสามารถใช้ได้fmt.Scan
หรือfmt.Scanln
ตามด้านล่าง
func main() {
var someVar int
fmt.Scanln(&someVar)
}