Golang中如何類比C語言中的if(scanf(…)==EOF)來控制輸入的終止

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

相信很多從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




相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.