2010-09-20 42 views
60

Làm cách nào để sử dụng chức năng fmt.Scanf trong Tìm kiếm để nhận đầu vào số nguyên từ đầu vào tiêu chuẩn?Đọc một số nguyên từ đầu vào tiêu chuẩn

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

Trả lời

97

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

Tất cả thư viện được bao gồm trong Go đều được ghi lại.

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

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

không lừa

+0

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

+0

@robertking hãy thử sử dụng một bufio thay vào đó là một ví dụ đơn giản. – cthom06

+0

Chúc mừng. Bufio nhanh. –

37

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

package main 

import "fmt" 

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

này sử dụng phản ánh trên 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

+14

Bạn không nên làm điều đó mà không kiểm tra lỗi;) – kyrias

3

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

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 
} 
1

Golang fmt.Scan là đơn giản hơn Golang fmt.Scanf (đó là đơn giản hơn Clang scanf)

Nếu lỗi fmt.Scan tức là nếu không con số không, đăng nhập & trở

1 đã đọc đơn biế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) 

Best of luck

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

Các vấn đề liên quan