并行处理——如何使用fmt.在围棋中扫描



我似乎有一个奇怪的问题,而获得用户输入在一个循环去。这是我的代码

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循环中运行代码吗?

你用的是什么操作系统?窗户吗?

试试这个:

package main
import "fmt"
func main() {
    var num int
    for i := 0; i < 10; i++ {
        fmt.Printf("Debug: i : %dn", i)
        fmt.Println("Enter next number")
        n, err := fmt.Scanf("%dn", &num)
        if err != nil {
            fmt.Println(n, err)
        }
        fmt.Println(num)
    }
}
输出:

Debug: i : 0
Enter next number
1
1
Debug: i : 1
Enter next number
2
2
Debug: i : 2
Enter next number
3
3
Debug: i : 3
Enter next number
4
4
Debug: i : 4
Enter next number
5
5
Debug: i : 5
Enter next number
6
6
Debug: i : 6
Enter next number
7
7
Debug: i : 7
Enter next number
8
8
Debug: i : 8
Enter next number
9
9
Debug: i : 9
Enter next number
10
10

上面的答案是一个很好的建议。代码

    if err != nil {
        fmt.Println(n, err)
    }

将输出此问题的原因。

  10 unexpected newline

所以我把代码改成这样,它就能工作了

package main
import "fmt"
func main() {
    var num int
    for i := 0; i < 10; i++ {
        fmt.Printf("Debug: i : %d ", i)
        fmt.Scanf("%dn", &num) // add "n"
        fmt.Println(num)
    }
}

这是因为不同的行尾。窗口使用回车和换行(rn)作为行结束。Unix使用换行(n)。

您可以使用notepad2创建一个文件(a.txt)与r换行。然后这样做:

  go run s.go < input.txt

只是为了指出fmt.Scanln(&num)可能与fmt.Scanf("%dn",&num)的工作方式相同,因为fmt.Scanln(&num)也检查"num"的类型。

换句话说,如果

var num float32
fmt.Scanln(&num)

可以从控制台输入浮点数。

我也有同样的问题,我解决了添加"n"在scanf格式字符串中:fmt.Scanf("% d n" num)。

最新更新