为了账号安全,请及时绑定邮箱和手机立即绑定

避免空格作为输入

避免空格作为输入

Go
斯蒂芬大帝 2022-07-04 10:38:46
我是 golang 的新手,已经从 python 切换了。我正在尝试扫描一个数组并将其显示给用户。但是,如果有任何尾随空格,则 go 不会等待用户输入下一个 int(就像在 c++ 中发生的那样),而是使用零。func main() {    var k int    fmt.Scanf("%d", &k)    for i:= 0 ; i< k ; i++{        arr(5)    }}func arr(l int){    arr:= make([]int, l)    for i := 0; i < l; i++ {        fmt.Scanf("%d",&arr[i])    }    fmt.Println(arr)}这是我的代码,所以当我输入1_1_2_3_4_5_ 其中下划线表示将打印出来的黑色空间[0 1 2 3 4]预期的结果是[1 2 3 4 5]我的代码有问题吗?或者这就是 Scanf() 函数的工作方式,如果是这样,我应该使用什么以便它类似于 c++ scanf() 的工作方式?我试图了解为什么我自己会发生这种情况并遇到缓冲区,但我不明白这里的图片是如何出现的。
查看完整描述

1 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

您的输出是忽略返回的错误的结果fmt.Scanf。


使用您显示的第一次调用fmt.Scanfinside的输入arr()将返回: 0和 unexpected newline.


第一个值是成功扫描的项目数。第二个是返回的错误。因为有一个错误,arr[0]没有分配任何东西并保持在默认值0. 由于您忽略了错误,因此程序将继续并从下一行开始arr[1]扫描。1


根据fmt.Scanf文档,错误来自输入中的换行符需要匹配格式字符串中的换行符这一事实。


要正确处理第一行,您应该具有以下内容:


func main() {

    var k int

    n, err := fmt.Scanf("%d\n", &k)

    if err != nil {

        panic(err)

    }

    if n != 1 {

        panic("expected one input")

    }

    for i:= 0 ; i< k ; i++{

        arr(5)

    }

}

您同样需要处理arr().

两条忠告:

  • 永远不要忽略错误

  • 阅读您使用的功能的文档


查看完整回答
反对 回复 2022-07-04
  • 1 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信