我是 golang 的新手,已經從 python 切換了。我正在嘗試掃描一個數組并將其顯示給用戶。但是,如果有任何尾隨空格,則 go 不會等待用戶輸入下一個 int(就像在 c++ 中發生的那樣),而是使用零。func main() { var k int fmt.Scanf("%d", &k) for i:= 0 ; i< k ; i++{ arr(5) }}func arr(l int){ arr:= make([]int, l) for i := 0; i < l; i++ { fmt.Scanf("%d",&arr[i]) } fmt.Println(arr)}這是我的代碼,所以當我輸入1_1_2_3_4_5_ 其中下劃線表示將打印出來的黑色空間[0 1 2 3 4]預期的結果是[1 2 3 4 5]我的代碼有問題嗎?或者這就是 Scanf() 函數的工作方式,如果是這樣,我應該使用什么以便它類似于 c++ scanf() 的工作方式?我試圖了解為什么我自己會發生這種情況并遇到緩沖區,但我不明白這里的圖片是如何出現的。
1 回答

慕娘9325324
TA貢獻1783條經驗 獲得超4個贊
您的輸出是忽略返回的錯誤的結果fmt.Scanf。
使用您顯示的第一次調用fmt.Scanfinside的輸入arr()將返回: 0和 unexpected newline.
第一個值是成功掃描的項目數。第二個是返回的錯誤。因為有一個錯誤,arr[0]沒有分配任何東西并保持在默認值0. 由于您忽略了錯誤,因此程序將繼續并從下一行開始arr[1]掃描。1
根據fmt.Scanf文檔,錯誤來自輸入中的換行符需要匹配格式字符串中的換行符這一事實。
要正確處理第一行,您應該具有以下內容:
func main() {
var k int
n, err := fmt.Scanf("%d\n", &k)
if err != nil {
panic(err)
}
if n != 1 {
panic("expected one input")
}
for i:= 0 ; i< k ; i++{
arr(5)
}
}
您同樣需要處理arr().
兩條忠告:
永遠不要忽略錯誤
閱讀您使用的功能的文檔
- 1 回答
- 0 關注
- 129 瀏覽
添加回答
舉報
0/150
提交
取消