Đọc một số nguyên từ đầu vào chuẩn


85

Làm cách nào để sử dụng fmt.Scanfhàm trong Go để lấy đầu vào số nguyên từ đầu vào chuẩn?

Nếu điều này không thể được thực hiện bằng cách sử dụng fmt.Scanf, cách tốt nhất để đọc một số nguyên là gì?

Câu trả lời:


132

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

Tất cả các thư viện có trong Go đều được ghi chép đầy đủ.

Điều đó đang được nói, tôi tin rằng

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

có lừa không


fmt.Scanf mất khoảng một phút để quét 1 triệu số nguyên.
robert king

@robertking hãy thử sử dụng bufio để thay thế Đây là một ví dụ đơn giản.
cthom06,

Chúc mừng. Bufio rất nhanh.
vua robert

5
Bạn có thể giải thích lý do tại sao chúng tôi phải nhập &ivà không chỉ inhư trong fmt.Printf("%v", i)?
Zeynel

6
@Zeynel Vì các tham số được truyền theo giá trị trong Go. ichỉ là giá trị số nguyên trong i, &ilà một con trỏ tới i.
cthom06,

48

Một giải pháp thay thế có thể ngắn gọn hơn một chút là chỉ sử dụng fmt.Scan:

package main

import "fmt"

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

Điều này sử dụng sự phản ánh về loại đối số để khám phá cách phân tích cú pháp đầu vào.

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


4

Đây là phương pháp "IO nhanh" của tôi để đọc số nguyên dương. Nó có thể được cải thiện với các bithifts và bố trí trước bộ nhớ.

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 đơn giản hơn Golang fmt.Scanf (đơn giản hơn Clang scanf)

Nếu lỗi fmt.Scan, tức là nếu không phải nil, hãy ghi lại và trả về

1 Đọc biến đơn:

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 Đọc nhiều biến:

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)

May mắn nhất

Ví dụ từ: http://www.sortedinf.com/?q=golang-in-1-hour


0

Bạn có thể sử dụng fmt.Scanfvới công cụ định dạng. Thông số định dạng cho số nguyên là% d. Vì vậy, bạn có thể sử dụng đầu vào tiêu chuẩn như bên dưới.

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

hoặc nếu không bạn có thể sử dụng fmt.Scanhoặc fmt.Scanlnnhư bên dưới.

func main() {
   var someVar int
   fmt.Scanln(&someVar)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.