使用Go语言接收带空格的输入

24

我刚开始学GO,我了解到SCANF在GO中使用空格作为分隔符。

fmt.Scanf("%s",&input)

我无法找到一种接受包含空格的输入作为有效字符的方法。


你说过你不想把空格字符视为分隔符。那么哪些字符会被视为分隔符呢? - James Henstridge
5
当用户按下回车键时,表示输入结束。 - av192
这个问题应该关闭了——它已经不再适用于任何后续版本的Go。它显示在谷歌的顶部答案中,浪费了大家的时间。 - undefined
4个回答

39

您可以使用bufio.Reader和os.Stdin:

import(
  "bufio"
  "os"
)

in := bufio.NewReader(os.Stdin)

line, err := in.ReadString('\n')

您能否详细阐述一下您的答案,并对您提供的解决方案进行更多描述? - abarisone
我认为解决方案是使用golang中的“bufio”库获取输入。http://golang.org/pkg/bufio/ - rchlin
1
读取的字符串将是 This is a string\n,而我希望它是 This is a string - VyomYdv
Golang v1.2.0 对我来说有另一种方法可行:in := bufio.NewReader(os.Stdin) line, err = in.ReadString('\n')去掉 ":=",只使用等号。 - Facundo Padilla
这是错误的答案,它将输出:<nil>YOURIUNPUT\n - undefined
这是错误的,它返回<nil>YOURINPUT\n。 - undefined

37

与@chlin的答案类似,使用bufio捕获整行。

fmt Scan方法将每个空格分隔的值存储到连续的参数中。在标准输入中输入三个参数需要这样做:

package main

import "fmt"

func main() {
    var day, year int
    var month string
    fmt.Scanf("%d %s %d", &day, &month, &year)
    fmt.Printf("captured: %d %s %d\n", day, month, year)
}
如果您不知道将要阅读的内容的完整格式,只想获取行文本,请使用 bufio:
package main

import (
  "bufio"
  "os"
)

func main(){
    scanner := bufio.NewScanner(os.Stdin)
    scanner.Scan() // use `for scanner.Scan()` to keep reading
    line := scanner.Text()
    fmt.Println("captured:",line)
}

1
你会如何修改这里的代码,使其能够接受n个输入? - martin8768

1
使用ReadString('\n')时,它会读取直到并包括换行符为止。如果你想从输入字符串中删除这个尾随的换行符,可以使用strings.TrimSpace函数。
package main

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

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Please enter a string: ")
    text, _ := reader.ReadString('\n')
    text = strings.TrimSpace(text)  // Remove any surrounding whitespace including the newline.
    fmt.Printf("You entered: %s", text)
}

-5
当用户按下回车键时,它表示输入结束。
看起来像是 fmt.Scanln

Scanln 类似于 Scan,但会在换行符处停止扫描,在最后一个条目之后必须有换行符或 EOF。


2
当我使用这个函数时,程序会自动运行而不等待用户输入。 - av192
@av192 这很奇怪,考虑到它们各自的实现(https://github.com/golang/go/blob/439b32936367c3efd0dadab48dd51202e1a510f1/src/fmt/scan.go#L131-L148) - VonC
2
参考文档提到了Scan。从Scan中可以看出:“...将连续的以空格分隔的值存储到连续的参数中。”如果您想从stdin捕获整个输入,我建议使用bufio.NewScanner(os.Stdin)。 - sethammons
13
这并没有解决将包含空格的字符串作为输入的问题。例如,我的字符串是"Hello there"。 - DevX
@av192,请注意,如果您传递的是变量本身而不是变量的地址(例如 fmt.Scanln(var) 而不是 fmt.Scanln(&var)),程序不等待用户输入的问题会出现。有人能解释一下这种行为背后的原因吗? - Zac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接