猿问

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

为什么这段代码会运行两次外部 for 循环?


这是我的代码:


package main


import "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 loops

No of loops

No of loops


跃然一笑
浏览 204回答 1
1回答

繁星点点滴滴

好吧,如果您查看文档中的如何扫描它说Scan、Fscan、Sscan 将输入中的换行符视为空格。我试过下面的代码package mainimport "fmt"func main() {&nbsp; &nbsp; loops := 1&nbsp; &nbsp; for loops > 0 {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("\nNo of loops\n")&nbsp; &nbsp; &nbsp; &nbsp; temp := 1&nbsp; &nbsp; &nbsp; &nbsp; fmt.Scanf("%d %d", &loops, &temp)&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Temp:", temp)&nbsp; &nbsp; &nbsp; &nbsp; for i := 0; i < loops; i++ {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("\ti: %d \n", i)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}我创建了一个临时变量并从上面的 os.Stdin 扫描。loops=1 的输出是Loop: 1No of loops1Temp: 1&nbsp; &nbsp; &nbsp; &nbsp; i: 0Loop: 1No of loops所以 temp 取出了新行,外循环按预期执行。没有临时变量,流程就像-> loops=1&nbsp;-> outer for&nbsp;-> scanf loops (as 1)&nbsp;-> inner for loop&nbsp;-> outer for&nbsp;-> 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)
随时随地看视频慕课网APP

相关分类

Go
我要回答