首页 >后端开发 >Golang >fmt.Scanln 意外换行错误:fmt.Scan 和 fmt.Scanln 之间有什么区别?

fmt.Scanln 意外换行错误:fmt.Scan 和 fmt.Scanln 之间有什么区别?

Barbara Streisand
Barbara Streisand原创
2024-10-23 21:27:02567浏览

fmt.Scanln Unexpected Newline Error: What's the Distinction Between fmt.Scan and fmt.Scanln?

fmt.Scanln 意外换行错误:深入探讨 Go 的输入处理

许多 Go 开发者在以下情况时都会遇到“fmt.Scanln 预期换行错误”与用户输入交互。要理解此错误,深入研究 fmt.Scan 和 fmt.Scanln 的工作原理至关重要。

fmt.Scan 和空格分隔的输入
fmt.Scan 读取空格 -将输入与标准输入分开。提供给 fmt.Scan 的每个参数对应于由空格分隔的单个单词或值。换行符的存在被视为空格,允许多行输入。以下代码为例:

<code class="go">import "fmt"

func main() {
  var i int
  _, err := fmt.Scan(&i)
  if err == nil {
    fmt.Println("read 1 integer: ", i)
  }
}</code>

提供输入“123”,此代码将读取并打印“read 1 integer: 123”。

fmt.Scanln和换行符分隔输入
相反,fmt.Scanln 期望换行符作为分隔符。读取所有输入直到换行符后,它停止解析。 Scanln 文档中明确说明了这一点:

“Scanln 与 Scan 类似,但在换行符处停止扫描,并且在最后一项之后必须有换行符或 EOF。”

此行为具体表现为以下代码:

<code class="go">import "fmt"

func main() {
  var s string
  _, err := fmt.Scanln(&s)
  if err == nil {
    fmt.Println("read 1 line: ", s)
  }
}</code>

输入“每个人都喜欢冰淇淋”,​​此代码将读取并打印“读取 1 行:每个人都喜欢冰淇淋”。由空格分隔的“everybody”和“loves”的存在不会中断解析,因为 fmt.Scanln 仅由最后的换行符分隔。

理解错误
中在提供的初始示例中,Scanln 遇到错误“预期换行符”,因为输入字符串“每个人都喜欢冰淇淋”不以换行符结尾。要解决此问题,输入末尾必须存在换行符。

读取行的替代方法
如果目标是读取一行输入,请使用 ReadString来自 bufio.Reader 包是 fmt.Scanln 的可靠替代品:

<code class="go">import (
  "bufio"
  "os"
)

func main() {
  reader := bufio.NewReader(os.Stdin)
  line, err := reader.ReadString('\n')
  if err == nil {
    fmt.Println("read 1 line: ", line)
  }
}</code>

以上是fmt.Scanln 意外换行错误:fmt.Scan 和 fmt.Scanln 之间有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn