有人问道:
我刚开始接触go语言,在根据书写二分法的时候发现个问题。
虽然解决了,但搞不清楚原因是为什么。
代码如下:
package main
import "fmt"
func main() {
min, max := 0, 100
fmt.Printf("%d--%d", min, max)
for min < max {
i := (min + max) / 2
fmt.Printf("<=%d(y or n) ", i)
var s string
fmt.Scanf("%s", &s)
if s != "" && s[0] == 'y' {
max = i
} else {
min = i + 1
}
}
fmt.Printf("%d\n", max)
}
运行结果:
0--100 <=50(y or n)
输入 n
<=75(y or n) <=88(y or n)
这里会连续两次执行
fmt.Printf("<=%d(y or n) ", i)
即
fmt.Scanf("%s", &s)未被执行,或者说默认输入了某项内容,经过试验是默认了""空字符串。
我将fmt.Scanf("%s", &s)改成fmt.Scan(&s)后,这个错误没有再发生。
我对fmt.Scan()和fmt.Scanf()的用法就有了疑问,哪位能详细解释下!!!!!
感谢!!!!!!!!
更多评论
将Scanf改为:
n, err := fmt.Scanf("%s\n", &s)
if err != nil {
fmt.Println("error", err)
}
或者,你应该捕获一下fmt.Scanf返回的错误,看看是啥原因,就可以找到对应的解决方案了。
#1