การอ่านจำนวนเต็มจากอินพุตมาตรฐาน


86

ฉันจะใช้fmt.Scanfฟังก์ชันใน Go เพื่อรับอินพุตจำนวนเต็มจากอินพุตมาตรฐานได้อย่างไร

หากใช้ไม่ได้วิธีfmt.Scanfใดที่ดีที่สุดในการอ่านจำนวนเต็มเดียว

คำตอบ:


133

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

ไลบรารีทั้งหมดที่รวมอยู่ใน Go ได้รับการบันทึกไว้เป็นอย่างดี

ที่ถูกพูดฉันเชื่อ

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

เคล็ดลับไม่


fmt.Scanf ใช้เวลาประมาณหนึ่งนาทีในการสแกน 1 ล้านจำนวนเต็ม
robert king

@robertking ลองใช้ bufio แทนเป็นตัวอย่างง่ายๆ
cthom06

5
คุณสามารถอธิบายว่าทำไมเราต้องป้อน&iและไม่เพียง แต่iในขณะที่fmt.Printf("%v", i)?
Zeynel

6
@Zeynel เนื่องจากพารามิเตอร์ถูกส่งผ่านโดยค่าใน Go iเป็นเพียงค่าจำนวนเต็มในi, เป็นตัวชี้ไป&i i
cthom06

@ cthom06 คุณใช้อะไรในการสแกนด้วย bufio เอ่อ ... ฉันหมายถึงว่าคุณกำลังใช้ Scanner อินเทอร์เฟซใดที่คุณป้อนลงในเครื่องสแกนเนอร์เพื่อสแกน stdin? NVM ดูเหมือนว่า golang มีตัวอย่างscanner := bufio.NewScanner(os.Stdin)
Greg

48

อีกทางเลือกหนึ่งที่รัดกุมกว่านี้คือใช้fmt.Scan:

package main

import "fmt"

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

สิ่งนี้ใช้การสะท้อนประเภทของอาร์กิวเมนต์เพื่อค้นหาว่าควรแยกวิเคราะห์ข้อมูลเข้าอย่างไร

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


4

นี่คือวิธี "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
}

3

Golang fmt Scan นั้นง่ายกว่า Golang fmt.Scanf (ซึ่งง่ายกว่า Clang scanf)

หากข้อผิดพลาด fmt.Scan เช่นถ้าไม่ใช่ศูนย์ให้เข้าสู่ระบบและส่งคืน

1 อ่านตัวแปรเดียว:

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 อ่านตัวแปรหลายตัว:

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


0

คุณสามารถใช้fmt.Scanfกับตัวระบุรูปแบบ ตัวระบุรูปแบบสำหรับจำนวนเต็มคือ% d ดังนั้นคุณสามารถใช้อินพุตมาตรฐานดังต่อไปนี้

func main() {
    var someVar int
    fmt.Scanf("%d", &someVar)
}

หรืออื่น ๆ ที่คุณสามารถใช้ได้fmt.Scanหรือfmt.Scanlnตามด้านล่าง

func main() {
   var someVar int
   fmt.Scanln(&someVar)
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.