Go 程序不等待 scanf 输入

问题描述 投票:0回答:2

我在c中发现了一些类似的问题,但解决方案是c特定的。包主

这是代码的最小工作示例

import "fmt"

func main() {
  var mode string
  var base int
  for {
    fmt.Printf("(Base) [-->]: ")
    fmt.Scanf("%d", &base)
    fmt.Printf("(Mode) [-->]: ")
    fmt.Scanf("%s", &mode)
  }
}

我的问题是,在请求模式输入后,它不等待输入,并立即跳到循环的开头。像这样的东西:

(Base) [-->]: 5
(Mode) [-->]: (Base) [-->]:
go input scanf
2个回答
1
投票

我也遇到了同样的问题,将

fmt.Scanf("%d", &base)
更改为
fmt.Scanf("%d \n", &base)
。我认为它连接到 Scanf() 的输出,其中第一个 scanf 不会消耗额外的换行符。上面的代码可能仍然可以在某些设备上运行,没有任何错误。

import "fmt"

func main() {
  var mode string
  var base int
  for {
    fmt.Printf("(Base) [-->]: ")
    fmt.Scanf("%d \n", &base)
    fmt.Printf("(Mode) [-->]: ")
    fmt.Scanf("%s \n", &mode)
  }
}

0
投票

您可以使用

fmt.Scanln(&base)
代替
fmt.Scanf("%d", &base)
:

import "fmt"

func main() {
    var mode string
    var base int
    for {
        fmt.Printf("(Base) [-->]: ")
        fmt.Scanln(&base)
        fmt.Printf("(Mode) [-->]: ")
        fmt.Scanln(&mode)
    }
}

对于

fmt.Scanf()
输入中的换行符必须与格式中的换行符匹配。

© www.soinside.com 2019 - 2024. All rights reserved.