5

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

4

4 回答 4

5

您使用的是什么操作系统?视窗?

试试这个:

package main

import "fmt"

func main() {
    var num int
    for i := 0; i < 10; i++ {
        fmt.Printf("Debug: i : %d\n", i)
        fmt.Println("Enter next number")
        n, err := fmt.Scanf("%d\n", &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
于 2012-12-22T07:35:44.390 回答
2

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

    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("%d\n", &num) // add "\n"
        fmt.Println(num)
    }
}

这是因为不同的行尾。windows 使用回车和换行(\r\n)作为行尾。Unix 使用换行符(\n)。

您可以使用notepad2创建带\r换行符的文件 (a.txt)。并这样做:

  go run s.go < input.txt

这将正常工作。

于 2012-12-23T02:56:50.167 回答
1

只是要指出 fmt.Scanln(&num) 可能与 fmt.Scanf("%d\n",&num) 相同,因为 fmt.Scanln(&num) 也会检查“num”的类型。

换句话说,如果

var num float32

fmt.Scanln(&num)

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

于 2013-03-08T03:46:59.137 回答
0

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

于 2021-06-09T12:03:54.550 回答