这一段代码为什么会判断两次

题目:9. 写一个竞猜游戏,用户必须猜一个秘密的数字,在每次猜完后程序会告诉用户他猜的数是太大了还是太小了,直到猜测正确,最后打印出猜测的次数。如果用户连续猜测同一个数字则只算一次。

package main

import "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 main

import (

"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

回到顶部