我正在尝试从stdin读取输入,如
3 2 1<ENTER>
并将其保存在整数列表中。目前我的代码看起来像这样:
nums = make([]int, 0)
var i int
for {
_, err := fmt.Scan(&i)
if err != nil {
if err==io.EOF { break }
log.Fatal(err)
}
nums = append(nums, i)
}
目前程序永远不会离开for循环。我找不到一种简单的方法来检查文档中的换行符。我该怎么做?
编辑:
因为我知道几乎肯定会有四个数字,所以我尝试了以下内容:
var i0,i1,i2,i3 int
fmt.Scanf("%d %d %d %d\n", &i0, &i1, &i2, &i3)
但这只扫描了第一个数字然后退出程序。我不确定这是不是因为我使用的是z-shell。
编辑:
为了澄清,程序将暂停并要求用户输入由空格分隔的n个数字的列表,并以换行符结束。这些数字应存储在一个数组中。
答案 0 :(得分:3)
好的,我决定拿出大型的bufio锤子并解决它:
in := bufio.NewReader(os.Stdin)
line, err := in.ReadString('\n')
if err != nil {
log.Fatal(err)
}
strs := strings.Split(line[0:len(line)-1], " ")
nums := make([]int, len(strs))
for i, str := range strs {
if nums[i], err = strconv.Atoi(str); err != nil {
log.Fatal(err)
}
}
看起来确实有很多代码,但它确实有用。
答案 1 :(得分:2)
您似乎想要https://golang.org/pkg/fmt/#Fscanln
像
这样的东西ok := func(err error) { if err != nil { panic(err) } }
for {
var i, j, k int
_, err := fmt.Fscanln(io.Stdin, &i, &j, &k)
ok(err)
fmt.Println(i, j, k)
}
答案 2 :(得分:1)
我建议使用&#34; bufio&#34;打包&#34;扫描()&#34;方法。 以下是我从&#34; stdin&#34;中读取两行的代码。并将这些行存储到一个数组中。 希望这会对你有所帮助。
package main
import (
"fmt"
"bufio"
"os"
"strconv"
"strings"
)
func ReadInput() []string{
var lines []string
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
lines = append(lines, scanner.Text())
//count, _ := strconv.Atoi(lines[0])
if len(lines) == 2 { break }
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, err)
}
return lines
}
func main(){
lines := ReadInput()
count ,_ := strconv.Atoi(lines[0])
num := strings.Fields(lines[1])
if count != len(num) { os.Exit(0) }
// Do whatever you want here
}
将接受两行。第一行将有一个计数。第二行将包含所有数字。您可以根据自己的要求修改相同的代码。
示例:
3
1 5 10