如何使用Go语言的fmt.Scanf
函数从标准输入获取整数输入?
如果不能使用fmt.Scanf
,那么读取单个整数的最佳方法是什么?
http://golang.org/pkg/fmt/#Scanf
Go语言中的所有标准库都有很好的文档。
话虽如此,我相信
func main() {
var i int
_, err := fmt.Scanf("%d", &i)
}
完成任务
一种更简洁的替代方法是直接使用fmt.Scan
:
package main
import "fmt"
func main() {
var i int
fmt.Scan(&i)
fmt.Println("read number", i, "from stdin")
}
这个方法通过反射输入参数的类型来发现如何解析输入。
这是我用于读取正整数的“快速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
}
Golang 的 fmt.Scan 比 Golang 的 fmt.Scanf 简单(比 Clang 的 scanf 还要简单)
如果 fmt.Scan 出现错误,即不为 nil,则记录日志并返回
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)
祝你好运
package main
import "fmt"
func main() {
var i int
fmt.Scanf("%d", &i)
fmt.Println(i)
}
您也可以使用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()
}
fmt.Scanf
。整数的格式说明符为%d。因此,您可以像下面这样使用标准输入。func main() {
var someVar int
fmt.Scanf("%d", &someVar)
}
或者你可以像下面这样使用fmt.Scan
或fmt.Scanln
。
func main() {
var someVar int
fmt.Scanln(&someVar)
}
fmt.Printf("%v", i)
中我们必须输入&i
而不只是i
,你能解释一下吗?(提示:这涉及到 Go 语言中的指针) - Zeyneli
只是i
的整数值,而&i
是指向i
的指针。 - cthom06scanner := bufio.NewScanner(os.Stdin)
。 - Gregif err != nil { log.Fatal(err) }
,否则它会抛出一个错误,因为你已经声明了err
但没有使用它。 - 0xsegfault