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

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

题目: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("大了")
    }
  }
}

【热门文章】
【热门文章】