最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言中三個輸入函數(shù)(scanf,scan,scanln)的區(qū)別解析

 更新時間:2024年10月29日 14:58:54   作者:2301_76723322  
本文詳細介紹了Go語言中三個輸入函數(shù)Scanf、Scan和Scanln的區(qū)別,包括用法、功能和輸入終止條件等,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧

Go語言中三個輸入函數(shù)(scanf,scan,scanln)的區(qū)別

在 Go 語言中,fmt 包提供了三種輸入函數(shù):Scanf、Scan 和 Scanln。這三個函數(shù)都是用于從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)并存儲到變量中,但是它們在處理輸入的方式上有所不同。下面詳細解讀每個函數(shù)的特點和用法。

1. fmt.Scanf

  • 用法:fmt.Scanf(format string, a …interface{}) (n int, err error)
  • 功能:根據(jù)格式化字符串 format 從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),并將數(shù)據(jù)存儲到提供的參數(shù)中。格式化字符串類似于 C 語言中的 scanf,例如 %d 表示讀取一個整數(shù),%s 表示讀取一個字符串。
  • 輸入終止條件:Scanf 讀取輸入時,會忽略空白字符,并且根據(jù)格式化字符串解析輸入內(nèi)容。輸入可以包含換行符,但解析會按照格式字符串中的要求進行。

示例代碼:

package main
import (
    "fmt"
)
func main() {
    var a int
    var b string
    fmt.Print("請輸入一個整數(shù)和一個字符串(格式如:123 hello):")
    fmt.Scanf("%d %s", &a, &b) // 根據(jù)格式化字符串讀取
    fmt.Println("整數(shù):", a)
    fmt.Println("字符串:", b)
}

注意:

如果輸入的格式與指定的格式字符串不匹配,可能會導(dǎo)致讀取失敗或產(chǎn)生意外結(jié)果。

2. fmt.Scan

  • 用法:fmt.Scan(a …interface{}) (n int, err error)
  • 功能:讀取由空格分隔的輸入數(shù)據(jù),并將數(shù)據(jù)存儲到提供的參數(shù)中。它不需要格式化字符串,而是依次將輸入的值賦給傳入的變量。
  • 輸入終止條件:輸入以空格或換行符為分隔符,讀取的值必須與傳入的參數(shù)數(shù)量匹配。

示例代碼:

package main
import (
    "fmt"
)
func main() {
    var a int
    var b string
    fmt.Print("請輸入一個整數(shù)和一個字符串(用空格分隔):")
    fmt.Scan(&a, &b) // 直接讀取輸入到變量中
    fmt.Println("整數(shù):", a)
    fmt.Println("字符串:", b)
}

注意:

  • 輸入數(shù)據(jù)必須能正確解析為指定的變量類型,否則會出現(xiàn)錯誤。
  • 如果輸入的值數(shù)量與變量數(shù)量不匹配,程序會等待進一步的輸入。

3. fmt.Scanln

  • 用法:fmt.Scanln(a …interface{}) (n int, err error)
  • 功能:與 fmt.Scan 類似,但會在讀取完所有指定的參數(shù)后檢查是否有多余的輸入。它要求讀取的最后一個輸入?yún)?shù)必須位于行的末尾,否則會返回一個錯誤。
  • 輸入終止條件:讀取到換行符結(jié)束,并要求讀取的參數(shù)數(shù)量與傳入的變量數(shù)量匹配。

示例代碼:

package main
import (
    "fmt"
)
func main() {
    var a int
    var b string
    fmt.Print("請輸入一個整數(shù)和一個字符串(用空格分隔,并按回車結(jié)束):")
    fmt.Scanln(&a, &b) // 讀取輸入到變量中,并檢查換行
    fmt.Println("整數(shù):", a)
    fmt.Println("字符串:", b)
}

注意: 如果輸入的值數(shù)量與傳入的變量數(shù)量不匹配,或者在讀取所有參數(shù)后還有多余的輸入,則會返回錯誤。 總結(jié)比較

在這里插入圖片描述

  • Scanf 更加靈活,可以指定格式,但要求輸入格式必須匹配。
  • Scan 和 Scanln 更適合簡單的輸入讀取,Scanln 還會檢查是否有多余的輸入。
    在實際應(yīng)用中,根據(jù)需要選擇適當(dāng)?shù)暮瘮?shù)來讀取用戶輸入。

這三種函數(shù),都會將換行符,一起讀取嗎?

在 Go 語言中,fmt.Scanf、fmt.Scan 和 fmt.Scanln 這三個函數(shù)處理換行符的方式有所不同。讓我們詳細解釋它們對換行符的處理:

1. fmt.Scanf

  • 換行符處理:Scanf 不會將換行符視為特殊的輸入結(jié)束標(biāo)記,它會根據(jù)指定的格式化字符串來解析輸入數(shù)據(jù)。
  • 輸入中包含換行符:如果換行符符合格式化字符串的要求,它會被視為空白字符而被忽略,否則會被保留在輸入流中等待下一次讀取。

示例:

var a int
var b string
fmt.Print("請輸入一個整數(shù)和一個字符串(如:123 hello):")
fmt.Scanf("%d %s", &a, &b) // 如果輸入 "123\nhello",換行符會被忽略

在這個例子中,輸入時如果用戶輸入 “123\nhello”,換行符會被忽略,因為它只是分隔了兩個數(shù)據(jù)。

2. fmt.Scan

  • 換行符處理:Scan 將換行符視為空白字符,與空格一樣被忽略。它會繼續(xù)讀取輸入,直到滿足所有變量的賦值。
  • 連續(xù)輸入的情況:即使輸入中有換行符,Scan 仍然會嘗試從輸入流中讀取更多的數(shù)據(jù),直到滿足要求的變量數(shù)量。

示例:

var a int
var b string
fmt.Print("請輸入一個整數(shù)和一個字符串(用空格分隔):")
fmt.Scan(&a, &b) // 如果輸入 "123\nhello",換行符會被忽略

在這個例子中,輸入 “123\nhello” 時,Scan 會忽略換行符并繼續(xù)讀取輸入,直到讀取到字符串 “hello”。

3. fmt.Scanln

  • 換行符處理:Scanln 會將換行符作為輸入的結(jié)束標(biāo)志。當(dāng)所有的輸入?yún)?shù)都讀取完畢后,Scanln 要求輸入流中不能有多余的數(shù)據(jù)。如果有多余的數(shù)據(jù),即使是換行符,也會返回錯誤。
  • 換行符終止:它要求最后一個輸入?yún)?shù)之后必須是換行符,否則會報錯。

示例:

var a int
var b string
fmt.Print("請輸入一個整數(shù)和一個字符串(用空格分隔,并按回車結(jié)束):")
fmt.Scanln(&a, &b) // 如果輸入 "123 hello\n",換行符作為結(jié)束標(biāo)志

在這個例子中,輸入 “123 hello\n” 時,Scanln 會正常讀取到整數(shù)和字符串,并認(rèn)為換行符是輸入的結(jié)束標(biāo)志。

總結(jié)

  • Scanf:根據(jù)格式化字符串解析輸入,換行符如果不影響解析會被忽略。
  • Scan:將換行符視為空白字符,會繼續(xù)讀取更多數(shù)據(jù),直到滿足所有變量的賦值要求。
  • Scanln:以換行符作為輸入結(jié)束標(biāo)志,如果在所有參數(shù)讀取完畢后還有多余輸入(除了換行符),會返回錯誤。

換行符是否被讀取取決于函數(shù)的設(shè)計和用法,Scanln 是唯一一個明確要求換行符作為結(jié)束標(biāo)志的函數(shù)。

輸入中包含換行符:如果換行符符合格式化字符串的要求,它會被視為空白字符而被忽略,否則會被保留在輸入流中等待下一次讀取。
對上面加粗部分的解釋:
為了更好地理解 fmt.Scanf 如何處理輸入中的換行符,下面舉一個具體的例子來說明這種行為。

例子

package main
import (
    "fmt"
)
func main() {
    var a int
    var b string
    fmt.Print("請輸入一個整數(shù)和一個字符串(格式:123 hello):")
    fmt.Scanf("%d %s", &a, &b)
    fmt.Println("a:", a)
    fmt.Println("b:", b)
}

示例 1:

  • 輸入內(nèi)容:123 hello,然后按下 Enter(實際上輸入的是 “123 hello\n”)。
  • 執(zhí)行過程:

a.fmt.Scanf(“%d %s”, &a, &b) 嘗試按格式化字符串 %d %s 解析輸入數(shù)據(jù)。
b.%d 匹配到整數(shù)部分,讀取 123,成功解析并賦值給變量 a。
c.%s 匹配到字符串部分,讀取 hello,成功解析并賦值給變量 b。
d.剩余的換行符 \n 被 Scanf 視為分隔符(空白字符)而忽略掉。

結(jié)果: 輸出:

a: 123
b: hello

示例 2:輸入 “123\nhello”

  • 輸入內(nèi)容:123,按下 Enter 鍵(輸入 “123\n”),然后再輸入 hello 并按下 Enter。
  • 執(zhí)行過程:

a.fmt.Scanf(“%d %s”, &a, &b) 首先嘗試解析 %d,從輸入 “123\n” 中讀取到整數(shù) 123 并賦值給 a。
b.接下來,fmt.Scanf 嘗試讀取 %s,但此時輸入流中的字符是換行符 \n,它不符合字符串的格式要求。因此,Scanf 讀取 %s 的嘗試失敗,換行符 \n 被保留在輸入流中等待下一次讀取。
c.因為讀取 %s 失敗,b 沒有被賦值,程序繼續(xù)等待下一個輸入。
d.當(dāng)用戶再輸入 hello 并按下 Enter 后,Scanf 成功讀取到字符串 hello 并賦值給 b。

結(jié)果: 輸出:

a: 123
b: hello

解釋

在示例 1 中,“123 hello\n” 中的換行符被視為空白字符,符合格式化字符串的要求,因此被忽略。而在示例 2 中,“123\nhello” 中的換行符不符合 %s 的格式要求,導(dǎo)致 Scanf 讀取失敗,換行符保留在輸入流中,等待下一次讀取。
這展示了 fmt.Scanf 處理換行符的兩種情況:符合格式時忽略,不符合時保留在輸入流中。

到此這篇關(guān)于Go語言中三個輸入函數(shù)(scanf,scan,scanln)的區(qū)別的文章就介紹到這了,更多相關(guān)Go 輸入函數(shù)scanf,scan,scanln內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Golang中string的實現(xiàn)原理與高效使用

    詳解Golang中string的實現(xiàn)原理與高效使用

    在Go語言中,無論是字符串常量、字符串變量還是代碼中出現(xiàn)的字符串字面量,它們的類型都被統(tǒng)一設(shè)置為string,下面就跟隨小編一起來了解一下Golang中string的實現(xiàn)原理與高效使用吧
    2024-01-01
  • Golang基于文件魔數(shù)判斷文件類型的案例代碼

    Golang基于文件魔數(shù)判斷文件類型的案例代碼

    這篇文章主要介紹了Golang基于文件魔數(shù)判斷文件類型,本文介紹了基于文件魔數(shù)判斷文件類型的方法,主要涉及如何ReadSeek讀取文件指定字節(jié)內(nèi)容,然后介紹文件魔數(shù),最后給出示例基于魔數(shù)判斷文件類型,需要的朋友可以參考下
    2023-02-02
  • Go?WaitGroup及Cond底層實現(xiàn)原理

    Go?WaitGroup及Cond底層實現(xiàn)原理

    這篇文章主要為大家介紹了Go?WaitGroup及Cond底層實現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • golang協(xié)程池設(shè)計詳解

    golang協(xié)程池設(shè)計詳解

    這篇文章主要介紹了golang協(xié)程池設(shè)計詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Go目錄文件路徑操作的實現(xiàn)

    Go目錄文件路徑操作的實現(xiàn)

    在Go語言中,可以使用絕對路徑或相對路徑來表示文件路徑,本文就來介紹一下Go目錄文件路徑操作,感興趣的可以了解一下
    2023-10-10
  • 精通Go語言日志記錄高效日志管理

    精通Go語言日志記錄高效日志管理

    本文將深入探討 Go 語言中的日志記錄,包括 Go 的標(biāo)準(zhǔn)日志庫的使用、流行的第三方日志庫以及如何在實際項目中實現(xiàn)有效的日志管理
    2023-11-11
  • 線上golang grpc服務(wù)資源泄露問題排查

    線上golang grpc服務(wù)資源泄露問題排查

    這篇文章主要介紹了線上golang grpc服務(wù)資源泄露問題排查,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 在Colaboratory上運行Go程序的詳細過程

    在Colaboratory上運行Go程序的詳細過程

    這篇文章主要介紹了在Colaboratory上運行Go程序,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Go語言中的網(wǎng)絡(luò)編程實現(xiàn)方式

    Go語言中的網(wǎng)絡(luò)編程實現(xiàn)方式

    Go語言作為一種簡潔而強大的編程語言,在網(wǎng)絡(luò)編程方面表現(xiàn)尤為出色,其內(nèi)置的net包提供了豐富的網(wǎng)絡(luò)I/O基礎(chǔ)設(shè)施,支持TCP、UDP協(xié)議,以及DNS解析等功能,本文將結(jié)合實際案例,詳細介紹Go語言在網(wǎng)絡(luò)編程中的詳細用法,需要的朋友可以參考下
    2024-10-10
  • Go語言設(shè)置JSON的默認(rèn)值操作

    Go語言設(shè)置JSON的默認(rèn)值操作

    這篇文章主要介紹了Go語言設(shè)置JSON的默認(rèn)值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

巧家县| 北票市| 奉新县| 二连浩特市| 双峰县| 花莲县| 财经| 宿州市| 白朗县| 米林县| 安平县| 定南县| 新余市| 全椒县| 沁水县| 巴彦淖尔市| 准格尔旗| 清苑县| 万宁市| 无棣县| 漠河县| 府谷县| 洪湖市| 大同市| 中江县| 永新县| 榆中县| 巩义市| 乌鲁木齐市| 都匀市| 辉南县| 温宿县| 福安市| 专栏| 日土县| 牙克石市| 留坝县| 瑞金市| 龙州县| 吴忠市| 藁城市|