5

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

私が気付いたのは、ループの各反復が 2 回発生することです。これは、Go がデフォルトで並列処理を使用しており、両方のプロセッサが for ループ内でコードを実行しているためでしょうか?

4

4 に答える 4

5

どのOSを使用していますか?ウィンドウズ?

これを試して:

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)
    }
}

これは、行末が異なるためです。ウィンドウは改行としてキャリッジ リターンとライン フィード ( \r\n) を使用します。Unix は改行 ( \n) を使用します。

notepad2を使用して、改行を含むファイル (a.txt) を作成できます\r。そしてこれを行います:

  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 に答える