Golang从stdin行

时间:2017-04-11 15:28:11

标签: go split scanf stdin

$ echo "A 1 2 3 4" | go run test.go 
entire:  A
next field:  A

我需要读取标准输入中的几行,例如“A 1 2 3 4”(代码现在只执行一行)并出现问题。 Scanln应该读取整行,Fields应该按换行分割?为什么Scanln只读一个字?

package main

import (
    "fmt"
    "strings"
)

func main() {
    var line string
    fmt.Scanln(&line)
    fmt.Println("entire: ",line)
    for _,x := range strings.Fields(line) {
        fmt.Println("next field: ",x)
    }
}
$ echo "A 1 2 3 4" | go run test.go 
entire:  A
next field:  A

3 个答案:

答案 0 :(得分:4)

你试过了吗?

package main

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

func main() {
    var line string
    scanner := bufio.NewScanner(os.Stdin)
    for scanner.Scan() {
        line = scanner.Text()
        fmt.Println("Got line:", line)
        for _, x := range strings.Fields(line) {
            fmt.Println("next field: ",x)
        }
    }
}

然后:

$ printf "aa bb \n cc dd " | go run 1.go  
Got line: aa bb
next field:  aa
next field:  bb
Got line:  cc dd
next field:  cc
next field:  dd

答案 1 :(得分:0)

我误解了另一个问题的回答,说Scanln读了一整行。不,Scanln只是一个扫描读取单词(空格分隔的字符串)和指定的实际变量,但退出解压缩。它完全令人困惑,因为readline等效于Go。

答案 2 :(得分:0)

如果要将每个输入存储到单独的变量中,可以尝试以下操作:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    var a, b string
    var c int
    var r = bufio.NewReader(os.Stdin)
    fmt.Fscanf(r, "%s %s %d", &a, &b, &c)
    fmt.Printf("%s %s %d", a, b, c)
}

它将给出以下输出:

//given input
w r 4
//output
w r 4