我刚开始使用GO,我理解SCANF在GO中使用空格作为分隔符.
fmt.Scanf("%s",&input)
Run Code Online (Sandbox Code Playgroud)
我真的找不到一种方法来接受包含空格作为有效字符的输入.
小智 16
你可以使用bufio.Reader和os.Stdin:
import(
"bufio"
"os"
)
in := bufio.NewReader(os.Stdin)
line, err := in.ReadString('\n')
Run Code Online (Sandbox Code Playgroud)
与@ chlin的答案类似,使用bufio捕获整行.
fmt Scan方法将每个空格分隔值存储到连续的参数中.关于stdin的三个论点需要:
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)
}
Run Code Online (Sandbox Code Playgroud)
如果您不知道要阅读的内容的完整格式并且只想要该行,请使用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)
}
Run Code Online (Sandbox Code Playgroud)
Von*_*onC -7
我最初的 2014 年答案用于fmt.Scanln这个特定的用例。
\n但fmt.Scanln也将空格视为输入之间的分隔符。这意味着它无法直接将包括空格的整行读取到单个字符串变量中,而无需进行额外的处理。
更好的选择是使用bufio.NewReader及其ReadString方法。
\n与 不同的是fmt.Scanln,bufio.NewReaderwithReadString允许您将整行输入(包括空格)读取到单个字符串中,直到遇到换行符。这种行为正是接受"Hello there"单个字符串等输入所需的行为。
Using fmt.Scanln: "Hello there" \xe2\x86\x92 "Hello"\nUsing bufio.NewReader: "Hello there" \xe2\x86\x92 "Hello there"\nRun Code Online (Sandbox Code Playgroud)\n用于bufio.NewReader读取一行输入(包括空格),直到用户按 Enter(换行符)为止,将是:
Using fmt.Scanln: "Hello there" \xe2\x86\x92 "Hello"\nUsing bufio.NewReader: "Hello there" \xe2\x86\x92 "Hello there"\nRun Code Online (Sandbox Code Playgroud)\n您可以在操场go.dev/play上测试它。
请记住,该ReadString方法返回分隔符作为输入的一部分,因此您可能需要修剪输入字符串以删除末尾的换行符。