扫描精确的字符数

时间:2015-01-10 15:45:13

标签: go

下面的代码打印15,因为它最多扫描输入中的2个字符。如果它不能成功扫描2个字符,是否可能使其失败?

package main

import (
    "errors"
    "fmt"
    "log"
)

func main() {
    var v uint8
    n, e := fmt.Sscanf("f!", "%02x", &v)
    if e != nil {
        log.Fatal(e)
    }
    if n != 1 {
        log.Fatal(errors.New("error"))
    }
    fmt.Println(v)
}

https://play.golang.org/p/Wl3QyjS8YS

1 个答案:

答案 0 :(得分:0)

我认为用fmt.Sscanf无法完成。

但是使用strconv呢?

以下是一个例子:

package main

import (
    "strconv"
    "fmt"
)

// parse reads a uint8 from s on exactly size digits in base 16
func parse( s string, size int ) (uint8, error) {
    if len(s) != size {
        return 0, strconv.ErrSyntax
    }
    n,err := strconv.ParseUint(s,16,8)
    return uint8(n),err
}

func main() {
    for _,x := range []string{ "ff", "f", "", "f!", "12", "00", "fff" } {
        if v,e := parse(x,2); e == nil {
            fmt.Println("ok:",v)
        } else {
            fmt.Println("ko:",e)
        }
    }   
}

在操场上:https://play.golang.org/p/PRkX0Wztz7