8

この小さなプログラムでユーザー入力を取得しようとしています。メソッドを使用してこれをいくつかの方法で実行しようとしましたstrconv.Atoi()(私の入力は明らかに文字列であり、整数に変換しようとしています)。これが私の最初の試みです:

package main
    import (
        "fmt"
        "strconv"
    )
    
    func main() {
        //fmt.Println(strconv.Itoa)
        fmt.Println("Say something, in numbers.")
        var inputstr string
        fmt.Scanln("%s", &inputstr)
        input := strconv.Atoi(inputstr)
        output := (input * 2)
        outputstr := strconv.Itoa(output)
        fmt.Println(outputstr)
    }

コンパイルに関しては、次のエラーが発生しました。

(19 行目) 単一値コンテキストでの複数値 strconv.Atoi()

次に、Godocs を調べて、これを自分で理解しようとしたところ、エラー値も返されることに気付きました。だから、私は

input := strconv.Atoi(inputstr)

input, _ := strconv.Atoi(inputstr)

これで、エラーなしで問題なくコンパイルされます。ただし、プログラムを実行すると、次のようになります。

数字で何か言ってください。

0

そして終了します...何が間違っていますか? Atoi()これは方法に関する質問だと思いますが、問題がある場合はScanln()修正してください。

4

1 に答える 1

9

問題は Scanln であることが判明しました。type not a pointer%s が原因で、Scanln がエラーを返しています。これにより、inputstr が空白のままになり、Atoi に渡されるとエラーが返されます: strconv.ParseInt: parsing "": invalid syntax.

Atoi を変更せずに、次のように Scanf を使用します。

func main() {
    //fmt.Println(strconv.Itoa)
    fmt.Println("Say something, in numbers.")
    var inputstr string

    //fmt.Scanln("%s", &inputstr)
    _, err := fmt.Scanf("%s", &inputstr)
    if err != nil {
        fmt.Println(err)
    }
    input, e := strconv.Atoi(inputstr)
    if e != nil {
        fmt.Println(e)
    }
    output := (input * 2)
    outputstr := strconv.Itoa(output)
    fmt.Println(outputstr)
}

おそらく最も簡単な解決策は、Scanln から「%s」を削除することです。

于 2013-10-23T02:56:14.773 に答える