登录
首页 >  Golang >  Go问答

Fscanf 并像 C 中那样省略字段

来源:stackoverflow

时间:2024-04-11 09:36:35 149浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《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\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 中那样省略字段》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>