golang从sdin扫描一行数字

时间:2015-10-08 13:40:48

标签: go

我正在尝试从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个数字的列表,并以换行符结束。这些数字应存储在一个数组中。

3 个答案:

答案 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