這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
相信很多從C/C++轉到Golang的朋友們都經常會對Go中的輸入控制感到頭疼。。。尤其是如果要在Go中類比C語言中的如下代碼會遇到不小困惑:
char input[100];while (1) { if (scanf("%s", input) == EOF) { printf("輸入結束\n"); break; }}
上面這段代碼在控制台中輸入一個Ctrl+Z(EOF) 就可以終止輸入了:
C語言中的
int scanf() 函數返回的是一個int類型,它的值只有三種情況:
(1) 如果一切正常,返回輸入的字元個數,即值>0
(2) 如果出現錯誤,返回0
(3) 如果遇到結束符EOF,返回-1
注意第三條:遇到結束符會返回-1,這樣就會結束輸入。也就是說,如果我們輸入EOF(EOF其實就是 -1),那麼輸入就會終止。
那麼我們用Go來試試,用 fmt.Scanf() (int, error) 函數吧:
var input stringfor {ret, err := Scanf("%s\r\n", &input) //fmt.Scanf()有兩個傳回值}
我們要注意這兩個傳回值,第一個傳回值代表fmt.Scanf()成功輸入的字元個數,第二個就是返回的錯誤了。
我們理所當然就會想到利用返回的錯誤值來試試能不能實現 C那樣在控制台中輸入Ctrl+Z 來結束輸入:
import (. "fmt""io")func main() {var input stringfor {_, err := Scanf("%s\r\n", &input)if err == io.EOF {break}}}
但是實驗結果表明這樣做沒用作用,怎麼輸入Ctrl+Z 都無法終止輸入!
對了,fmt.Scanf() 還返回了一個 int類型的傳回值,對比剛才C語言中的scanf()的傳回值,會不會這個改進版的C語言也像祖先一樣用-1來表明EOF呢?試試吧:
import (. "fmt""text/scanner")func main() {var input stringfor {ret, _ := Scanf("%s\r\n", &input)if ret == scanner.EOF { //或者用ret == -1break}}}
實驗了之後發現這樣也不能在控制台中用輸入Ctrl+Z 來結束輸入。
這樣就奇怪了,難道Go程式擷取控制台的Ctrl+Z後不會把它看做EOF???於是決定測試一下控制台中輸入 Ctrl+Z 到底輸入進了什麼,測試代碼如下:
import (. "fmt")func main() {var input stringfor {_, _ = Scanf("%s\r\n", &input)Printf("輸入的長度為:%d\n", len(input))Printf("輸入的字元為: %s\n", input)Printf("輸入的字元的編碼為:%d\n", input[0])}}
運行結果顯示:
ASCII碼為26的字元為:
好吧,原來當我們在控制台中向Go程式輸入Ctrl+Z 時,原來錄入的編碼是26。那麼我們就以這麼來改進我們之前的代碼:
import (. "fmt""strings")func main() {var input stringfor {_, _ = Scanf("%s\r\n", &input)var eof rune = 26if strings.Contains(input, string(eof)) {Printf("輸入結束\n")break}}}
這樣一來就能成功的用 Ctrl+Z 來結束輸入了:
如果轉載請註明出處:http://blog.csdn.net/gophers/article/details/20656301