从标准输入读取整数

时间:2010-09-20 12:22:27

标签: go stdin

如何使用Go中的fmt.Scanf函数从标准输入中获取整数输入?

如果使用fmt.Scanf无法做到这一点,那么读取单个整数的最佳方法是什么?

6 个答案:

答案 0 :(得分:115)

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

Go中包含的所有库都有详细记录。

话虽如此,我相信

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

诀窍

答案 1 :(得分:47)

可以更简洁的替代方法是使用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

答案 2 :(得分:3)

这是我用于读取正整数的“快速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 :(得分:3)

Golang fmt.Scan比Golang fmt.Scanf简单(比Clang scanf简单)

如果fmt.Scan错误,即如果不是nil,则log&amp;返回

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

答案 4 :(得分:0)

CASE 
  WHEN CHAR_LENGTH(TRIM(some_string_date)) = 8
  THEN
    CAST(
      SUBSTRING(TRIM(some_string_date) FROM 1 FOR 4)
      || '-'
      || SUBSTRING(TRIM(some_string_date) FROM 5 FOR 2)
      ||'-'
      || SUBSTRING(TRIM(some_string_date) FROM 7 FOR 2)
    as DATE) 
  ELSE
    NULL 
END

答案 5 :(得分:0)

您可以将fmt.Scanf与格式说明符一起使用。整数的格式说明符为%d。因此,您可以使用如下所示的标准输入。

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

否则您可以按以下方式使用fmt.Scanfmt.Scanln

func main() {
   var someVar int
   fmt.Scanln(&someVar)
}