有人问道:
我刚开始接触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()的用法就有了疑问,哪位能详细解释下!!!!!
感谢!!!!!!!!
在写[《Golang标准库》](https://github.com/polaris1119/The-Golang-Standard-Library-by-Example)的[fmt一节](https://github.com/polaris1119/The-Golang-Standard-Library-by-Example/blob/master/chapter01/01.3.md)时,个人感觉这是Go在Windows下的bug,已经向官方提出 https://code.google.com/p/go/issues/detail?id=5391。
nil是go中的关键字,相当于其他语言的null啊;其实加上\n,相当于使用fmt.Scanln()。
#5
更多评论
将Scanf改为:
n, err := fmt.Scanf("%s\n", &s)
if err != nil {
fmt.Println("error", err)
}
或者,你应该捕获一下fmt.Scanf返回的错误,看看是啥原因,就可以找到对应的解决方案了。
#1