登录
首页 >  Golang >  Go问答

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

来源:SegmentFault

时间:2023-01-19 10:42:04 216浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《这一段代码为什么会判断两次》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

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

文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《这一段代码为什么会判断两次》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表