golang接受带空格的输入

av1*_*192 3 space input go

我刚开始使用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)


set*_*ons 9

与@ 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)

  • 您将在这里进行哪些调整以使其接受“n”输入? (2认同)

Von*_*onC -7

我最初的 2014 年答案用于fmt.Scanln这个特定的用例。
\n但fmt.Scanln也将空格视为输入之间的分隔符。这意味着它无法直接将包括空格的整行读取到单个字符串变量中,而无需进行额外的处理。

\n
\n

更好的选择是使用bufio.NewReader及其ReadString方法
\n与 不同的是fmt.Scanlnbufio.NewReaderwithReadString允许您将整行输入(包括空格)读取到单个字符串中,直到遇到换行符。这种行为正是接受"Hello there"单个字符串等输入所需的行为。

\n
Using fmt.Scanln:        "Hello there" \xe2\x86\x92 "Hello"\nUsing bufio.NewReader:   "Hello there" \xe2\x86\x92 "Hello there"\n
Run Code Online (Sandbox Code Playgroud)\n

用于bufio.NewReader读取一行输入(包括空格),直到用户按 Enter(换行符)为止,将是:

\n
Using fmt.Scanln:        "Hello there" \xe2\x86\x92 "Hello"\nUsing bufio.NewReader:   "Hello there" \xe2\x86\x92 "Hello there"\n
Run Code Online (Sandbox Code Playgroud)\n

您可以在操场go.dev/play上测试它。

\n

请记住,该ReadString方法返回分隔符作为输入的一部分,因此您可能需要修剪输入字符串以删除末尾的换行符。

\n

  • 这并不能解决将包含空格的字符串作为输入的问题。即 mystr =“你好” (16认同)
  • 当我使用此功能时,程序会自行运行,不会等待用户输入。 (2认同)
  • 引用的文档提到了扫描。来自 Scan:“...将连续的空格分隔值存储到连续的参数中。” 如果您想从标准输入捕获整个输入,我建议 bufio.NewScanner(os.Stdin)。 (2认同)