2013-10-23 31 views
7

我想在這個小程序中獲得用戶輸入。我試過用strconv.Atoi()方法做這幾種方法(我的輸入顯然是一個字符串,我試圖將它轉換爲一個整數)。這是我第一次嘗試:如何在Go中使用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) 
    } 

,並得到了以下錯誤,當它來編譯:

(line 19) multiple-value strconv.Atoi() in single-value context

然後我看着Godocs,並試圖弄清楚這一點我自己,然後認識到了錯誤值也被返回。所以,我改變了

input := strconv.Atoi(inputstr) 

input, _ := strconv.Atoi(inputstr) 

現在這個編譯就好了,沒有任何錯誤。然而,當我運行該程序,這裏是我得到的:

Say something, in numbers.

0

然後它退出......我做錯了什麼?我相信這是一個關於Atoi()方法的問題,但如果它涉及Scanln()那麼請糾正我。

+2

你應該*處理你的錯誤,而不是忽略它們。他們可能會幫助您診斷問題。 – elithrar

+3

你是絕對正確的。我在這裏做的是糟糕的編程,但更重要的是我需要解釋事情的工作原理。所以,我去這裏... –

回答

5

問題原來是Scanln。由於%s,Scanln返回錯誤type not a pointer。然後這使得inputstr爲空,當給予Atoi時返回錯誤:strconv.ParseInt: parsing "": invalid syntax

使用SCANF與不改變ATOI如下:

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」。

+0

所以基本上,「%s」只是一個格式字符,將輸入轉換爲字符串? –

+0

實際上,%s被用作Sscan的格式字符,但是在你的代碼中它從Scanf(「%s」,..)中得到兩個錯誤,一個不喜歡%s,另一個來自'Atoi'不喜歡空字符串。 – miltonb