如何在Go中使用fmt.Scanf

在for循环中获取用户输入时,我似乎遇到了一个奇怪的问题。这是我的代码


package main


import "fmt"


func main() {

    var num int

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

        fmt.Printf("Debug: i : %d ", i)

        fmt.Scanf("%d", &num)

        fmt.Println(num)

    }

}

当我运行此代码时,将发生以下情况:


Debug: i : 0

Enter next number

1

1

Debug: i : 1

Enter next number

1

Debug: i : 2

Enter next number

2

2

Debug: i : 3

Enter next number

2

Debug: i : 4

Enter next number

3

3

Debug: i : 5

Enter next number

3

Debug: i : 6

Enter next number

4

4

Debug: i : 7

Enter next number

4

Debug: i : 8

Enter next number

5

5

Debug: i : 9

Enter next number

5

我注意到的是,循环的每次迭代都发生两次,这可能是因为Go默认情况下使用了并行性,并且导致两个处理器都在for循环中运行代码吗?


精慕HU
浏览 236回答 3
3回答

弑天下

您正在使用什么操作系统?视窗?试试这个:package mainimport "fmt"func main() {&nbsp; &nbsp; var num int&nbsp; &nbsp; for i := 0; i < 10; i++ {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("Debug: i : %d\n", i)&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Enter next number")&nbsp; &nbsp; &nbsp; &nbsp; n, err := fmt.Scanf("%d\n", &num)&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(n, err)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(num)&nbsp; &nbsp; }}输出:Debug: i : 0Enter next number11Debug: i : 1Enter next number22Debug: i : 2Enter next number33Debug: i : 3Enter next number44Debug: i : 4Enter next number55Debug: i : 5Enter next number66Debug: i : 6Enter next number77Debug: i : 7Enter next number88Debug: i : 8Enter next number99Debug: i : 9Enter next number1010

qq_遁去的一_1

上面的答案是一个很好的建议。编码&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(n, err)&nbsp; &nbsp; }将输出此问题的原因。&nbsp; 10 unexpected newline因此,我将代码更改为此,并且它可以正常工作。package mainimport "fmt"func main() {&nbsp; &nbsp; var num int&nbsp; &nbsp; for i := 0; i < 10; i++ {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("Debug: i : %d ", i)&nbsp; &nbsp; &nbsp; &nbsp; fmt.Scanf("%d\n", &num) // add "\n"&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(num)&nbsp; &nbsp; }}这是因为行尾不同。Windows使用回车和换行(\r\n)作为行尾。Unix使用换行符(\n)。您可以使用notepad2创建带有\r换行符的文件(a.txt)。并执行以下操作:&nbsp; go run s.go < input.txt这将正常工作。

慕虎7371278

仅指出fmt.Scanln(#)可能与fmt.Scanf(“%d \ n”,#)相同,因为fmt.Scanln(#)也检查“ num”的类型。换句话说,如果var&nbsp;num&nbsp;float32 fmt.Scanln(&num)您可以从控制台输入浮动号码。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go