从标准输入读取一个整数。

96

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

如果不能使用fmt.Scanf,那么读取单个整数的最佳方法是什么?

7个回答

150

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

Go语言中的所有标准库都有很好的文档。

话虽如此,我相信

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

完成任务


fmt.Scanf 花费了约一分钟的时间扫描100万个整数。 - Rusty Rob
@robertking 尝试使用bufio代替。这是一个简单的例子。 - cthom06
8
为什么在 fmt.Printf("%v", i) 中我们必须输入 &i 而不只是 i,你能解释一下吗?(提示:这涉及到 Go 语言中的指针) - Zeynel
9
因为 Go 语言中参数是按值传递的,所以 i 只是 i 的整数值,而 &i 是指向 i 的指针。 - cthom06
@cthom06,你在使用bufio进行扫描时用的是什么?哦,我的意思是,如果你正在使用Scanner接口来扫描标准输入(stdin),那么你输入到Scanner中的接口是什么?算了,看起来golang有一个例子scanner := bufio.NewScanner(os.Stdin) - Greg
1
你需要添加 if err != nil { log.Fatal(err) },否则它会抛出一个错误,因为你已经声明了 err 但没有使用它。 - 0xsegfault

60

一种更简洁的替代方法是直接使用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


6

这是我用于读取正整数的“快速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
}

5

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)

读取多个变量:

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
为什么我们不能像在C语言中一样使用scanf呢?虽然它可以工作。
package main
import "fmt"
func main() {
    var i int
    fmt.Scanf("%d", &i)
    fmt.Println(i)
}

请检查其他答案,以避免提交重复答案。 - Ali Padida

0

您也可以使用bufio.NewReader从标准输入读取整数。

以下程序:

  • 提示输入一个整数

  • 创建一个bufio.Reader以从标准输入读取

  • 读取输入直到遇到换行符'\n'请注意,这只会读取一个整数。空格分隔的值将不起作用

  • 删除换行符

  • 将字符串转换为整数

package main

import (
    "fmt"
    "bufio"
    "os"
    "strconv"
    "strings"
)

func getInt() error {
    fmt.Println("Enter an integer")
    userInput  := bufio.NewReader(os.Stdin)
    userVal, err := userInput.ReadString('\n')
    if err != nil {
        return err
    }

    input := strings.TrimSpace(userVal)
    intVal, err := strconv.Atoi(input)
    if err != nil {
        return err
    }

    fmt.Printf("You entered: %d\n", intVal)
    return nil
}

func main() {
    getInt()
}

0
你可以使用带有格式说明符的fmt.Scanf。整数的格式说明符为%d。因此,您可以像下面这样使用标准输入。
func main() {
    var someVar int
    fmt.Scanf("%d", &someVar)
}

或者你可以像下面这样使用fmt.Scanfmt.Scanln

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接