亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

尋找相當于scanf的Go

尋找相當于scanf的Go

Go
牛魔王的故事 2021-04-08 14:09:00
我正在尋找相當于scanf()的Go。我嘗試使用以下代碼:  1 package main  2   3 import (  4     "scanner"  5     "os"  6     "fmt"  7 )  8   9 func main() { 10     var s scanner.Scanner 11     s.Init(os.Stdin) 12     s.Mode = scanner.ScanInts 13     tok := s.Scan() 14     for tok != scanner.EOF { 15         fmt.Printf("%d ", tok) 16         tok = s.Scan() 17     } 18     fmt.Println() 19 }我用帶有整數行的文本輸入來運行它。但是它總是輸出-3 -3 ...以及如何掃描由字符串和一些整數組成的行?每當遇到新的數據類型時都要更改模式?軟件包文檔:包裹掃描儀用于UTF-8編碼文本的通用掃描儀。但似乎該掃描儀不是用于一般用途。更新的代碼:func main() {    n := scanf()    fmt.Println(n)    fmt.Println(len(n))}func scanf() []int {    nums := new(vector.IntVector)    reader := bufio.NewReader(os.Stdin)    str, err := reader.ReadString('\n')    for err != os.EOF {        fields := strings.Fields(str)        for _, f := range fields {            i, _ := strconv.Atoi(f)            nums.Push(i)        }           str, err = reader.ReadString('\n')    }       r := make([]int, nums.Len())    for i := 0; i < nums.Len(); i++ {        r[i] = nums.At(i)    }       return r}改良版:package mainimport (    "bufio"    "os"    "io"    "fmt"    "strings"    "strconv"    "container/vector")func main() {    n := fscanf(os.Stdin)    fmt.Println(len(n), n)}func fscanf(in io.Reader) []int {    var nums vector.IntVector    reader := bufio.NewReader(in)    str, err := reader.ReadString('\n')    for err != os.EOF {        fields := strings.Fields(str)        for _, f := range fields {            if i, err := strconv.Atoi(f); err == nil {                nums.Push(i)            }           }           str, err = reader.ReadString('\n')    }       return nums}
查看完整描述

3 回答

?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

沒有行號,更新后的代碼更容易編譯,但是缺少package和import語句。


查看您的代碼,我注意到了幾件事。這是我的代碼修訂版。


package main


import (

    "bufio"

    "fmt"

    "io"

    "os"

    "strconv"

    "strings"

    "container/vector"

)


func main() {

    n := scanf(os.Stdin)

    fmt.Println()

    fmt.Println(len(n), n)

}


func scanf(in io.Reader) []int {

    var nums vector.IntVector

    rd := bufio.NewReader(os.Stdin)

    str, err := rd.ReadString('\n')

    for err != os.EOF {

        fields := strings.Fields(str)

        for _, f := range fields {

            if i, err := strconv.Atoi(f); err == nil {

                nums.Push(i)

            }

        }

        str, err = rd.ReadString('\n')

    }

    return nums

}

我可能要使用任何輸入文件scanf(),而不僅僅是Stdin;scanf()以aio.Reader作為參數。


您寫道:nums := new(vector.IntVector),在哪里type IntVector []int。這會分配一個名為的整數切片引用nums并將其初始化為零,然后該new()函數會分配一個整數切片參考并將其初始化為零,然后將其分配給nums。我寫道:var nums vector.IntVector,它通過簡單地分配一個名為的整數切片引用nums并將其初始化為零來避免冗余。


您沒有檢查的err值strconv.Atoi(),這意味著無效的輸入已轉換為零值。我跳過它。


要將向量從向量復制到新切片并返回該切片,您編寫了:


r := make([]int, nums.Len())

for i := 0; i < nums.Len(); i++ {

    r[i] = nums.At(i)

}

return r

首先,我簡單地將其替換為等效的IntVector.Data()方法:return nums.Data()。然后,我利用了這一事實,type IntVector []int并通過將其替換為來避免分配和復制return nums。


查看完整回答
反對 回復 2021-04-26
?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

本示例始終一次讀取一行,然后將整個行作為字符串返回。如果要從中解析出特定值,則可以。


package main


import (

    "fmt"

    "bufio"

    "os"

    "strings"

)


func main() {

    value :=    Input("Please enter a value: ")

    trimmed := strings.TrimSpace(value)

    fmt.Printf("Hello %s!\n", trimmed)

}


func Input(str string) string { 

        print(str) 

        reader := bufio.NewReader(os.Stdin) 

        input, _ := reader.ReadString('\n') 

        return input 

}


查看完整回答
反對 回復 2021-04-26
?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

在對我的回答之一的評論中,您說:


根據語言規范:“當通過聲明或make()或new()調用分配內存來存儲值時,沒有提供任何顯式初始化,則為該內存提供默認初始化”。那new()有什么意義呢?


如果我們運行:


package main


import ("fmt")


func main() {

    var i int

    var j *int

    fmt.Println("i (a value) = ", i, "; j (a pointer) = ", j)

    j = new(int)

    fmt.Println("i (a value) = ", i, "; j (a pointer) = ", j, "; *j (a value) = ", *j)

}

該聲明var i int分配內存以存儲整數值,并將該值初始化為零。該聲明var j *int分配內存以存儲指向整數值的指針,并將該指針初始化為零(nil指針);沒有分配內存來存儲整數值。我們看到程序輸出類似于:


i (a value) =  0 ; j (a pointer) =  <nil>

內置函數new采用類型T并返回type的值*T。內存被初始化為零值。該語句j = new(int)分配內存以存儲整數值,并將該值初始化為零,然后在j中存儲指向該整數值的指針。我們看到程序輸出類似于:


i (a value) =  0 ; j (a pointer) =  0x7fcf913a90f0 ; *j (a value) =  0


查看完整回答
反對 回復 2021-04-26
  • 3 回答
  • 0 關注
  • 239 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號