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