我是新手,我只想打印用户输入的字符串n次,但它只打印了n次空格.这是我的代码

package main

import (
    "fmt"
)

func main() {
    var n int
    var s string
    fmt.Scanf("%d", &n)
    fmt.Scanf("%s", &s)

    for i := 0; i < n; i++ {
        fmt.Printf("%s\n", s)
    }
}

有什么办法可以解决这个问题吗?谢谢.

推荐答案

看一看Scanf docs

Scanf扫描从标准输入读取的文本,将连续的空格分隔值存储到格式确定的连续参数中.它返回成功扫描的项目数.如果该数目少于参数数量,则Err将报告原因.输入中的换行符必须与格式中的换行符匹配.唯一的例外是:动词%c总是扫描输入中的下一个符文,即使它是空格(或制表符等)或换行符.

与您的问题最相关的两点是:

  • 空格分隔值
  • 输入中的换行符必须与格式中的换行符匹配

因此,如果您按原样运行您的应用程序,然后输入20 foo并按Enter键,您将得到预期的输出(foo打印20次).但是,如果您输入20,然后按Enter键,您将看到20个空行;要了解为什么要运行:

var n int
var s string
fmt.Scanf("%d", &n)
_, err := fmt.Scanf("%s", &s)
if err != nil {
    panic(err)
}

这将在panic: unexpected newline出现异常,因为根据规范,"输入中的换行符必须与格式中的换行符匹配".假设您希望在每次输入后按Enter键,则可以使用fmt.Scanf("%d\n", &n).然而,正如您在注释中提到的,如果您使用fmt.Scanf("%s\n", &s)并输入一个包含空格的字符串,那么您将只得到第一位(因为scanf使用空格作为分隔符).

如果你想从stdin得到一整行,那么this question的答案提供了一些选项,例如

func main() {
    var n int
    var s string
    fmt.Println("How many times? ")
    fmt.Scanf("%d\n", &n)
    fmt.Println("What to output? ")
    reader := bufio.NewReader(os.Stdin)
    s, _ = reader.ReadString('\n')

    for i := 0; i < n; i++ {
        fmt.Printf("%s", s)
    }
}

Go相关问答推荐

区分Terminal和Hook Zerolog Go中的错误级别日志(log)输出

如何从google.golang.org/grpc/stats包中将golang中不同事件的输出进行组合,以获取func HandlePRC

具有GRPC的RBAC(基于角色的访问控制)-网关生成的REST风格的API

ChromeDriver不存在(高朗selenium)

Golang使用Run()执行的命令没有返回

go grpc:无法导入github.com/golang/protobuf/proto(没有所需的模块提供包github.com/gorang/protobuf-proto)

Golang:访问any类型泛型上的字段

Go:如何在不加载正文的情况下创建 http 代理通行证

如何在正则表达式中使整个单词可选?

golang gin 获取 cookie json

是否可以在调试期间在 VSCode 中预览 github.com/shopspring/decimal 值?

如何使用管理员权限启动 powershell 进程并重定向标准输入 (os.exec)

Go:从 ssl 证书中获取 'subject/unstructeredName' 的值

为什么 Go 被认为是部分抢占式的?

Golang - 将 [8] 布尔转换为字节

如何获取多个 url 参数值

无法在 GORM 中排序

Golang 使用 docker 将敏感数据作为参数传递

为什么 template.ParseFiles() 没有检测到这个错误?

在 etcd 键值存储中禁用历史记录