표준 입력에서 정수 읽기


85

fmt.ScanfGo 에서 함수를 사용 하여 표준 입력에서 정수 입력을 얻으려면 어떻게해야 합니까?

을 사용하여 수행 할 수없는 경우 fmt.Scanf단일 정수를 읽는 가장 좋은 방법은 무엇입니까?

답변:


132

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

Go에 포함 된 모든 라이브러리는 잘 문서화되어 있습니다.

즉, 나는 믿는다

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

속임수를 쓰다


fmt.Scanf는 1 백만 개의 정수를 스캔하는 데 약 1 분이 걸렸습니다.
로버트 왕

@robertking 대신 bufio를 사용해보십시오. 간단한 예입니다.
cthom06

건배. Bufio는 빠릅니다.
로버트 왕

5
우리가 입력해야하는 이유는 설명 할 수 &i없는 단지와 i같이 fmt.Printf("%v", i)?
Zeynel

6
@Zeynel 매개 변수는 Go에서 값으로 전달되기 때문입니다. i단지 정수 값 i, &i포인터이다 i.
cthom06

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 오류, 즉 nil이 아닌 경우 로그 및 반환

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.Scanfmt.Scanln같이 또는 사용할 수 있습니다 .

func main() {
   var someVar int
   fmt.Scanln(&someVar)
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.