扫描精确的字符数
scanning precise number of characters
下面的代码打印 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)
}
我认为 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)
}
}
}
下面的代码打印 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)
}
我认为 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)
}
}
}