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 回答