Fscanf 并像 C 中那样省略字段

2024年 2月 12日 50.2k 0

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 方法或正则表达式,例如:

  • strings.Split
  • pidString := strings.Split(string(s), " ")[1]
    pid, err := strconv.Atoi(pidString)
    if err != nil {
    panic(err) // handle the error
    }

    登录后复制

  • 使用正则表达式:
  • re := regexp.MustCompile(`[^s]+ (?Pd+)`) // 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 中那样省略字段的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论