英文:
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)
}
链接:https://play.golang.org/p/Wl3QyjS8YS
英文:
The code below prints 15
because it scans at most 2 characters in the input. Is it possible to make it fail if it does not scan successfully exactly 2 characters?
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)
}
答案1
得分: 0
我认为使用fmt.Sscanf
无法完成这个任务。
但是使用strconv
呢?
以下是一个示例:
package main
import (
"strconv"
"fmt"
)
// parse 从字符串 s 中以 16 进制的 base 解析出一个长度为 size 的 uint8 值
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)
}
}
}
在 playground 上查看:https://play.golang.org/p/PRkX0Wztz7
英文:
I think it cannot be done with fmt.Sscanf.
But what about using strconv instead?
Here is an example:
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)
}
}
}
In playground: https://play.golang.org/p/PRkX0Wztz7
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论