为了账号安全,请及时绑定邮箱和手机立即绑定

当我使用 fmt.Fscanf 时,为什么会出现“输入与格式不匹配”​​的情况?

当我使用 fmt.Fscanf 时,为什么会出现“输入与格式不匹配”​​的情况?

Go
达令说 2023-07-04 19:06:51
我正在尝试使用fmt.Fscanf,但我很难弄清楚如何使用。有以下代码:package mainimport (    "fmt"    "strings")func main() {    var host, user, date, httpStr string    var code, size int    r := strings.NewReader(`127.0.0.1 - james [09/May/2018:16:00:39 +0000] "GET /report HTTP/1.0" 200 123`)    _, err := fmt.Fscanf(r, `%s - %s [%s], "%s" %d %d`,        &host, &user, &date, &httpStr, &code, &size)    if err != nil {        fmt.Printf("Failed to parse log line, error: %+v\n", err)        panic(err)    }    fmt.Println(host, user, date, httpStr, code, size)}去游乐场:https://play.golang.org/p/zGxc6MXOF3a我得到:Failed to parse log line, error: input does not match formatpanic: input does not match formatgoroutine 1 [running]:main.main()        .../fscanf/main.go:19 +0x57bexit status 2为什么?
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

该错误来自如何Fscanf解析空格分隔的字符串。读取日期和 HTTP 字符串时,这会成为一个问题:

当它读取日期时,09/May/2018:16:00:39 +0000它不会读取日期,而是会读取直到第一个空格:09/May/2018:16:00:39然后是expect ]

要解决此问题,将字符串解析为 是有意义的[%s %s],但这会更巧妙地失败。它将解析时区,+0000]因为它停在第一个空格处,而不是根据格式字符串。HTTP 字符串也会出现同样的问题:它在动词之后停止解析GET,然后在路由之后停止/report解析,但是在读取协议时它读取HTTP/1.0"not HTTP/1.0

一个可行的解决方案如下:

package main


import (

    "fmt"

    "log"

    "strings"

)


func main() {

    var host, user, date, tzOffset, verb, route, proto string

    var code, size int


    r := strings.NewReader(`127.0.0.1 - james [09/May/2018:16:00:39 +0000] "GET /report HTTP/1.0" 200 123`)


    _, err := fmt.Fscanf(r, `%s - %s %s %s %s %s %s %d %d`,

        &host, &user, &date, &tzOffset, &verb, &route, &proto, &code,

        &size)


    if err != nil {

        log.Fatal(err)

    }


    date = date[1:] + " " + tzOffset[:len(tzOffset)-1]

    httpString := verb[1:] + " " + route + " " + proto[:len(proto)-1]


    fmt.Println(host, user, date, httpString, code, size)

}

这里,我们在解析时忽略日期和 HTTP 字符串周围的括号和引号,然后将其删除。


输出:


127.0.0.1 james 09/May/2018:16:00:39 +0000 GET /report HTTP/1.0 200 123


查看完整回答
反对 回复 2023-07-04
  • 1 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信