首頁  >  文章  >  後端開發  >  Fscanf 並像 C 中那樣省略字段

Fscanf 並像 C 中那樣省略字段

WBOY
WBOY轉載
2024-02-12 16:18:051080瀏覽

Fscanf 并像 C 中那样省略字段

問題內容

是否可以像 C 中省略欄位 %*s

var pid int
fmt.Fscanf(r, "%*s %d", &pid)

解決方法

實際上,在 Go 中你無法做到這一點(至少在 Go 1.21.0 上)。

原始碼表明:

  • 格式字串中沒有省略欄位的動詞(如C 語言中的%*s):實際上,字串的動詞總是單一字元 (% s%v%q%X%X)
  • Fscanf 方法迭代參數a 中的Fscanf 陣列(r io.Reader ,格式字串,a ...any))。因此,您必須a 中定義一個參數,即使您不關心它的值

如果您不想定義變量,可以使用:

var pid int
fmt.Fscanf(r, "%s %d", new(string), &pid)

其他替代方案

對於您的具體情況,要解析閱讀器中的某些內容,您可以先將閱讀器讀入字串(例如 io.ReadAll):

CB835C294C06824721603abd255bd78a

接著使用 strings.Split 方法或正規表示式,例如:

  1. strings.Split
pidString := strings.Split(string(s), " ")[1]
pid, err := strconv.Atoi(pidString)
if err != nil {
    panic(err) // handle the error
}
  1. 使用正規表示式:
re := regexp.MustCompile(`[^\s]+ (?P<pid>\d+)`) // similar to "%s %d"
matches := re.FindStringSubmatch(s)
pidString := matches[re.SubexpIndex("pid")]
pid, err := strconv.Atoi(pidString)
if err != nil {
    panic(err) // handle the error
}

可能還有其他方法,但這些應該足以說明。希望有幫助。

以上是Fscanf 並像 C 中那樣省略字段的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除