这一段代码为什么会判断两次
题目:9. 写一个竞猜游戏,用户必须猜一个秘密的数字,在每次猜完后程序会告诉用户他猜的数是太大了还是太小了,直到猜测正确,最后打印出猜测的次数。如果用户连续猜测同一个数字则只算一次。
package mainimport "fmt"
func main() {
var n = 100
var num int
var count int
var i = true
for i {
fmt.Println("前面")
fmt.Scanf("%d", &num)
fmt.Println("后面")
switch {
case num == n:
fmt.Println("答对了,程序退出")
count += 1
i = !true
case num < n:
fmt.Println("小了")
//fmt.Scanf("%d",&num)
count += 1
case num > n:
fmt.Println("大了")
// fmt.Scanf("%d",&num)
count += 1
}
}
fmt.Println(count)
}
实在是不明白..
回答:
我猜应该是Windows上回车键产生的是"\r\n"。
scanf这类方法的工作方式都比较诡异,我觉得是一个历史遗留的设计错误。
解决方法,先尝试将代码改成fmt.Scanf("%d\n",&num)
试下看看(这里"\n"不是表示它吃掉换行符,而是表示消耗掉其后的其它空白字符),不过这样在LINUX上则行不通了。
所以,正道是使用bufio.NewReader
,明确指定以换行符为输入结束(即相当于readline):
package mainimport (
"bufio"
"fmt"
"os"
)
func main() {
n := 100
stdin := bufio.NewReader(os.Stdin)
var num int
var count int
for {
count+=1
fmt.Fscan(stdin, &num)
stdin.ReadString('\n')
switch {
case num==n:
fmt.Println("答对了,程序退出")
fmt.Println(count)
os.Exit(0)
case num<n:
fmt.Println("小了")
case num>n:
fmt.Println("大了")
}
}
}
以上是 这一段代码为什么会判断两次 的全部内容, 来源链接: utcz.com/p/183397.html