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

在我的 Go 代码中,为什么外部 for 循环运行两次

在我的 Go 代码中,为什么外部 for 循环运行两次

Go
跃然一笑 2022-06-21 10:46:11
为什么这段代码会运行两次外部 for 循环?这是我的代码:package mainimport "fmt"func main() {    loops := 1    for loops > 0 {        fmt.Printf("\nNo of loops\n")        fmt.Scanf("%d", &loops)        for i := 0; i < loops; i++ {            fmt.Printf("%d ", i)        }    }}当我运行并输入 1 作为循环数时,输出如下:No of loops0 No of loops0 No of loops
查看完整描述

1 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

好吧,如果您查看文档中的如何扫描它说


Scan、Fscan、Sscan 将输入中的换行符视为空格。


我试过下面的代码


package main


import "fmt"


func main() {

    loops := 1

    for loops > 0 {

        fmt.Printf("\nNo of loops\n")

        temp := 1

        fmt.Scanf("%d %d", &loops, &temp)

        fmt.Println("Temp:", temp)

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

            fmt.Printf("\ti: %d \n", i)

        }

    }


}

我创建了一个临时变量并从上面的 os.Stdin 扫描。


loops=1 的输出是


Loop: 1

No of loops

1

Temp: 1

        i: 0

Loop: 1

No of loops

所以 temp 取出了新行,外循环按预期执行。


没有临时变量,流程就像


-> loops=1 

-> outer for 

-> scanf loops (as 1) 

-> inner for loop 

-> outer for 

-> scanning will be ignored. since buffer is present in Standard Input, i.e., new line.

-> inner for loop

也就是说,我们看到两个内部循环 for loops=1。这不仅适用于 for loops=1,而且对于任何循环值都会为您提供 2 个内部 for 循环。


您可以在代码中如上所述防止这种情况,也可以使用Scanln方法。


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


这样的事情应该做


fmt.Scanln(&loops)


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

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号